如何使某些 ListView 项目 'greyed-out' 无法选择?

How to make some ListView items 'greyed-out' and unselectable?

ListView 控件中的某些项目将 select 可用并具有普通文本。 然而,有些项目虽然作为项目包含在 ListView 中,但却是 unselectable/unclickable 和 'greyed-out'.

在 Windows-Store-Apps 中,我们能够 select Single/Multiple/None ListView 中的项目。但是如何在代码中主要在某些索引unselectable/unclickable和'greyed-out'处制作某些项目?

我成功访问了某个索引处的 ListView 的项目:

myListView.ItemContainerGenerator.ContainerFromIndex(i)

但我找不到任何选项来自定义其 selected 事件处理程序。 知道如何实现吗?

单选模式。 首先添加一个布尔值 属性 到 class 的绑定类型,它定义了哪些项目可以像这样点击

  class TestClass
  {
    Boolean IsClickAllowed{get;set;}
    string name{get;set;}
  }

然后创建一个TestClass类型的源列表,并像这样将其设置为Listview的itemssource

var TempList=new List<>()
                    {
                        new TextClass(){IsClickAllowed=false,name="First Item"},
                        new TextClass(){IsClickAllowed=true,name="Second Item"},
                        new TextClass(){IsClickAllowed=false,name="Third Item"},
                    };
                    MyList.ItemsSource=TempList;

并为实现 DataTemplateSelector 的不可点击项目设置不同的 DataTemplate 并最终为 ItemClick 事件中的点击句柄变灰。您需要将 IsItemClickEnabled 设置为 true。

private void MyList_ItemClick(object sender, ItemClickEventArgs e)
        {
            var item = e.ClickedItem as TestClass;
            if (item != null){
if(item.IsClickAllowed){
//Do Stuff here
}else
{
//Do Nothing
}
        }}

希望对您有所帮助。

我找到了解决方案:

我已经覆盖了 ListView 控件并创建了一个 StripedListView。然后通过覆盖 PrepareContainerForItemOverride,它负责在创建后设置 ListViewItem 控件,您可以修改背景颜色并将 ItemListView.isEnabled 选项设置为 false:

public class StripedListView : ListView
    {          
        protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
        {
            base.PrepareContainerForItemOverride(element, item);
            var listViewItem = element as ListViewItem;
            if (listViewItem != null)
            {
                var index = IndexFromContainer(element);

                if (Words.arrayW[index].Length > 0)
                {
                    listViewItem.Foreground = new SolidColorBrush(Colors.Black);

                }
                else
                {
                    listViewItem.Foreground = new SolidColorBrush(Colors.Gray); 
                    listViewItem.IsEnabled = false;
                }
            }
        }
    }

在Xaml中:

<controls:StripedListView x:Name="letterListView" ItemsSource="{Binding}">   
      <controls:StripedListView.ItemTemplate>  
         <DataTemplate>                           
                etc...              
         </DataTemplate>
      </controls:StripedListView.ItemTemplate>
</controls:StripedListView>