根据自定义禁用某些 ListViewItem 属性 UWP
Disable certain ListViewItem depending on custom property UWP
我有一个 ListView
,其中包含多种自定义类型 UserControls
。
项目要求其中一些必须是不可点击的,所以我想禁用它们,但是JUST THEM。
这些项目将 enabled/disabled 取决于自定义值 属性。
我尝试将 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: Unable to cast object of type
UserControl.Type to type Windows.UI.Xaml.Controls.ListViewItem.
有人知道我该怎么做吗?
提前致谢:)
foreach(var lwI in homeLW.Items)
{
ListViewItem item =(ListViewItem)homeLW.ContainerFromItem(lwI);
item.IsEnabled = false;
}
加载时,由于虚拟化,所有 ListViewItems
都不会加载。因此,当您尝试从项目中获取容器时,您会得到 Null。解决方法是关闭虚拟化。但它会产生性能影响。既然你确认它不会超过 20 个项目,我将继续添加代码
<ListView>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
要添加到 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;
}
}
我有一个 ListView
,其中包含多种自定义类型 UserControls
。
项目要求其中一些必须是不可点击的,所以我想禁用它们,但是JUST THEM。
这些项目将 enabled/disabled 取决于自定义值 属性。
我尝试将 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: Unable to cast object of type UserControl.Type to type Windows.UI.Xaml.Controls.ListViewItem.
有人知道我该怎么做吗?
提前致谢:)
foreach(var lwI in homeLW.Items)
{
ListViewItem item =(ListViewItem)homeLW.ContainerFromItem(lwI);
item.IsEnabled = false;
}
加载时,由于虚拟化,所有 ListViewItems
都不会加载。因此,当您尝试从项目中获取容器时,您会得到 Null。解决方法是关闭虚拟化。但它会产生性能影响。既然你确认它不会超过 20 个项目,我将继续添加代码
<ListView>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
要添加到 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;
}
}