根据自定义属性UWP禁用某些ListViewItem

时间:2016-05-10 07:46:41

标签: c# win-universal-app windows-10-universal windows-10-mobile

我有一个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}">

SourceObservableCollection<UserControl>

问题在于,我无法将ListView的项目设为ListViewItems,而是UserControl类型:执行此操作时:

foreach(ListViewItem lwI in homeLW.Items)
            {
                //CODE
            }

我明白了:

  

System.InvalidCastException:无法转换类型的对象   UserControl.Type以键入Windows.UI.Xaml.Controls.ListViewItem。

任何人都知道我该怎么做?

提前致谢:)

2 个答案:

答案 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;
    }
}