【问题标题】:Changing visibility of listview item更改列表视图项的可见性
【发布时间】:2017-09-27 17:12:25
【问题描述】:

我有另一个关于将可见性绑定到列表视图项的问题,并且得到了解答。

我现在遇到的问题是我正在尝试将可见性绑定到列表视图项的属性,但它似乎不起作用。

这是我的代码:

<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>

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

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

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

那么属性 FooVisibility 永远不会被调用。

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

【问题讨论】:

    标签: xaml uwp uwp-xaml


    【解决方案1】:

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

    您可以在ItemTemplate 中绑定根元素的Visibility 属性:

    <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)?

    【讨论】:

    • 当我这样做时,该项目不会呈现,但容器仍然会呈现,所以我看到一个空白框,其中设置为 Visibility.Collapsed 的 Foo 项目是
    • 处理 Grid 的 DataContextChanged 事件并以编程方式设置绑定。查看我的编辑。
    • 感谢所有帮助。当我添加 DataContextChanged FooVisibility 永远不会被调用。输出窗口中没有绑定错误。如果我将可见性直接设置为 Collapsed,则列表视图项会正确折叠,所以这似乎是正确的路径,我只是不确定为什么 FooVisibility 永远不会被调用。
    • 好的,你还需要将绑定的Source设置为Grid的DataContext。我再次编辑了我的答案。
    猜你喜欢
    • 2014-07-04
    • 2012-11-26
    • 2013-01-29
    • 2019-09-02
    • 1970-01-01
    • 2013-04-17
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多