更改listview项的可见性

时间:2017-09-27 17:12:26

标签: xaml uwp uwp-xaml

我有另一个关于将可见性绑定到listview项目的问题,并得到了回答。

我现在遇到的问题是我正在尝试将可见性绑定到listview项的属性,但它似乎无法正常工作。

这是我的代码:

<ListView 
    ItemsSource="{Binding FooList}"
    ItemTemplate="{StaticResource FooTemplate}"
    Grid.Row="3">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Padding" Value="0" />
            <Setter Property="MinHeight" Value="0" />
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

和模板:

<DataTemplate x:Key="FooTemplate">
            <Grid Background="White" HorizontalAlignment="Stretch">
   //template stuff
</Grid>

如果我尝试在模板中设置网格上的可见性,它会正确绑定并且不显示它不应该显示的Foo项目,但容器的空间仍然存在,它是&#39;只是空白。

如果我尝试在ItemContainer中设置可见性绑定:

<Setter Property="Visibility" Value="{Binding FooVisibility}" />

然后永远不会调用属性FooVisibility。

如果我有一个返回Visibility枚举的适当属性,隐藏特定ListView项目的适当方法是什么?

1 个答案:

答案 0 :(得分:2)

UWP不支持Style Setters中的绑定:https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.Setter#Windows_UI_Xaml_Setter_Value

您可以在Visibility

中绑定根元素的ItemTemplate属性
<DataTemplate x:Key="FooTemplate">
    <Grid Background="White" HorizontalAlignment="Stretch" 
          Visibility="{Binding FooVisibility}">

    </Grid>
</DataTemplate>

或者您可以编写一些代码,以编程方式在根元素的DataContextChanged事件的事件处理程序中设置绑定,如下所示:https://blog.magnusmontin.net/2016/02/28/disabling-selection-of-some-items-in-a-uwp-listview/

private void Grid_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
{
    Grid grid = sender as Grid;
    ListViewItem lvi = listView.ContainerFromItem(grid.DataContext) as ListViewItem;
    if (lvi != null)
    {
        lvi.SetBinding(ListViewItem.VisibilityProperty, new Binding() { Path = new PropertyPath("FooVisibility"), Source = grid.DataContext });
    }
}

或者,您可以创建自己的绑定助手类:

UWP Binding in Style Setter not working

Universal Apps: How to bind a property of a ListViewItem (container) to the actual item (View Model)?