使用绑定改变GridView项的可见性

本文关键字:可见性 GridView 改变 绑定 | 更新日期: 2023-09-27 18:12:46

如何使用属性绑定更改GridViewItems可见性?

我不能创建另一个ObservableCollection来过滤我使用的ItemsSource。我试图使用GridView.ItemContainerStyle来改变GridViewItem的风格,但似乎它不与绑定工作(虽然它工作,如果我将值设置为倒塌)。

<GridView.ItemContainerStyle>
    <Style TargetType="GridViewItem">
        <Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource booleanToVisibilityConverter}}" />
    </Style>
</GridView.ItemContainerStyle>

我也尝试使用DataTemplateSelector。我可以隐藏项目与绑定,但有空白在我的GridView,因为ItemContainer仍然在那里和不崩溃

我需要将GridView折叠,而不仅仅是隐藏

EDIT:为什么我想摆脱过滤的ObservableCollections ?

我试图镜像2 GridViews和1 ListView与相同的ItemsSourceSelectedItem都与我的ViewModel属性ItemsCurrent绑定。没有过滤器,它就像我期望的那样没有SelectionChanged事件,但只有的双向绑定

但是这些GridView/Listview必须有一些差异,比如可供选择的项目和它的DataTemplates。所以我正在使用过滤集合,这给我带来了问题。

例如:

  • GridView1有条目1、2和3
  • GridView2只有项目1和3
  • 我选择GridView1
  • 项目1
  • 我选择GridView1
  • 项目2

当我选择项目1时,它也在GridView2上被选中。现在还好。当我选择项目2时,项目1在GridView2上保持选中状态。GridView2现在应该没有选择,但如果我强制它,它将始终取消选择GridView2的项目2,因为两者的SelectedItem都是双向绑定的。

我希望你能理解,因为英语不是我的母语。

使用绑定改变GridView项的可见性

首先,样式不能工作,因为WinRT显然不支持setter中的绑定(见这里)。这篇文章确实提到了一个解决这个问题的方法,希望它对你有用(尽管我自己还没有尝试过)。

如果没有成功,GridView最终只是一个ItemsControl,所以你应该能够通过将其ItemsPanel属性设置为自定义面板来手动覆盖自己的布局。你可以像这样做一个小的自定义面板,与你的DataTemplateSelector一起使用,它可以折叠GridViewItems的内容:

class CustomPanel : Panel
{
    //Children of this panel should be of type GridViewItem (which is the ItemContainer for the
    //ItemsControl)
    protected override Size MeasureOverride(Size availableSize)
    {
        foreach (var child in this.Children)
        {
            var interior = (UIElement)VisualTreeHelper.GetChild(child, 0);
            interior.Measure(availableSize);
            if (interior.DesiredSize.Width == 0 && interior.DesiredSize.Height == 0)
                //Skip this item
            else
            {
                child.Measure(availableSize);
                //Update the total measure of the panel with child.DesiredSize...
            }
            //Return the total calculated size
        }
    }
    protected Size override ArrangeOverride(Size finalSize)
    {
        foreach (var child in this.Children)
        {
            var interior = (UIElement)VisualTreeHelper.GetVisualChild(child, 0);
            if (interior.DesiredSize.Width == 0 || interior.DesiredSize.Height == 0)
                //Skip this item
            else
                //Call child.Arrange with the appropriate arguments and update the total size
                //used...
            //Return the total size used
        }
    }
}

这段代码可以稍微清理一下,但是像这样的代码应该能够解决处理空gridviewitem出现的问题。

您可以使用项目索引从后面的代码修改GridViewItem可见性。项目索引与你在ObservableCollection

中的索引相同
var gridViewItem = (GridViewItem)this.GridView.ContainerFromIndex(index);
gridViewItem.Visibility = Visibility.Visible;