根据自定义禁用某些 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}">

其中 SourceObservableCollection<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;
    }
}