我有一个ListView
,其中包含多种类型的自定义UserControls
。
项目要求其中一些必须是不可点击的,所以我想禁用它们,但只是他们。
这些项目将根据自定义属性的值启用/禁用。
我已尝试将ListViewItem.IsEnabled
属性设置为false
,但它无法正常工作,而我找到的其他解决方案对我来说毫无意义......
我让代码示例:
XAML
<ListView x:Name="homeLW"
Margin="0,5,0,0"
ItemClick="homeLW_ItemClick"
IsItemClickEnabled="True"
HorizontalAlignment="Center"
ItemsSource="{Binding Source}">
Source
是ObservableCollection<UserControl>
。
问题在于,我无法将ListView
的项目设为ListViewItems
,而是UserControl
类型:执行此操作时:
foreach(ListViewItem lwI in homeLW.Items)
{
//CODE
}
我明白了:
System.InvalidCastException:无法转换类型的对象 UserControl.Type以键入Windows.UI.Xaml.Controls.ListViewItem。
任何人都知道我该怎么做?
提前致谢:)
答案 0 :(得分:3)
foreach(var lwI in homeLW.Items)
{
ListViewItem item =(ListViewItem)homeLW.ContainerFromItem(lwI);
item.IsEnabled = false;
}
加载时,由于虚拟化,所有ListViewItems
都不会被加载。所以当你尝试从item获取容器时你会得到Null。解决方法是关闭虚拟化。但它会产生性能影响。由于您确认它不会超过20个项目,我将继续添加代码
<ListView>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
答案 1 :(得分:0)
要添加到LoveToCode的答案,如果要在加载时禁用所选项目而不关闭虚拟化,则在加载UIElement时需要触发代码。否则,您将获得System.NullReferenceException。原因是因为没有加载框架元素来引用ListView容器。
homeLW.Loaded += DisableSelectedItemsOnLoad()
private void DisableSelectedItemsOnLoad()
{
foreach(var lwI in homeLW.Items)
{
ListViewItem item =(ListViewItem)homeLW.ContainerFromItem(lwI);
item.IsEnabled = false;
}
}