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

C# 使特定的ListView项目在通用Windows平台中不可单击,c#,xaml,win-universal-app,microsoft-metro,uwp,C#,Xaml,Win Universal App,Microsoft Metro,Uwp,我正在XAML中使用ListView元素: <ListView x:Name="myList" IsItemClickEnabled="true" ItemClick="onDrawerItemClick" SelectionMode="Single" ScrollViewer.VerticalScr

我正在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;
List listData=具有标题+图像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
属性

然后,订阅
myList
ContainerContentChangeing
事件,您可以在该事件中访问
ListViewItem
及其相应的
项目
,在本例中,它就是您的
MyObj
。因此,如果
MyObj.Disabled
true
,则使该
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
样式具有禁用状态,该状态会降低其
不透明度
;设置
listViewItem.IshittesVisible=false时,不会以任何方式更改其外观。

请参阅此链接