使特定的 ListView 项目在通用 Windows 平台中不可点击

Make specific ListView item not clickable in Universal Windows Platform

我在 XAML:

中使用 ListView 元素
                <ListView
                x:Name="myList"
                IsItemClickEnabled="true"
                ItemClick="onDrawerItemClick"
                SelectionMode="Single"
                ScrollViewer.VerticalScrollBarVisibility="Hidden">

                <ListView.ItemTemplate>
                    <DataTemplate>

                        <Grid
                            Width="260">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition
                                    Width="44" />
                                <ColumnDefinition
                                    Width="*" />
                            </Grid.ColumnDefinitions>

                            <Image
                                x:Name="image"
                                Source="{Binding myIcon}"
                                Grid.Column="0" />

                            <TextBlock
                                Text="{Binding myTxt}"
                                Grid.Column="1" />

                        </Grid>

                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

然后我使用 Bind 属性 填充它,如下所示:

List<MyObj> listData = a list with title + image uri;
myList.ItemsSource = listData;

我只需要根据列表中 MyObj 中的某些值禁用某些项目的点击,而其他项目则可以。在 Android 中,我们为此使用适配器,我应该如何处理它?

listView 是一个奇怪的控件,因为它没有任何禁用选择的机制。

所以我建议您做的是通过将事件处理程序附加到 ItemSelectionChanged 来处理通知框架已选择项目的事件,并在其中对项目执行取消选择:

yourListView.ItemSelectionChanged += yourListView_ItemSelectionChanged;

private void yourListView_ItemSelectionChanged(
    object sender,
    ListViewItemSelectionChangedEventArgs e)
{
   if (e.IsSelected)
      e.Item.Selected = false;
}

如果我的回答有帮助请告诉我:)

首先,您应该在 MyObj 对象中创建一个名为 Disabled 的新 bool 属性。

然后,订阅 myListContainerContentChanging 事件,您可以在其中访问 ListViewItem 及其对应的 Item,在本例中是您的 MyObj。因此,如果 MyObj.Disabledtrue,请使 ListViewItem 不可点击。

private void myList_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args)
{
    var listViewItem = args.ItemContainer;

    if (listViewItem != null)
    {
        var model = (MyObj)args.Item;

        if (model.Disabled)
        {
            listViewItem.IsHitTestVisible = false;

            // OR
            //listViewItem.IsEnabled = false;
        }
    }
}

请记住,如果您希望该项目显示为灰色,您可能需要使用 listViewItem.IsEnabled = false。这是因为默认的 ListViewItem 样式有一个 Disabled 状态,减少了它的 Opacity;而设置 listViewItem.IsHitTestVisible = false 不会以任何方式改变其外观。