如何使某些 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>
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>