C# 使用绑定更改GridView项的可见性

C# 使用绑定更改GridView项的可见性,c#,xaml,data-binding,windows-runtime,windows-store-apps,C#,Xaml,Data Binding,Windows Runtime,Windows Store Apps,如何使用属性绑定更改GridViewItems可见性? 我无法创建另一个ObservableCollection来筛选我正在用作项目资源的集合。我尝试使用GridView.ItemContainerStyle来更改GridViewItem样式,但它似乎不适用于绑定(尽管如果我将值设置为Collapsed,它会起作用) 我还尝试使用DataTemplateSelector。我可以使用绑定隐藏项目,但由于项目容器仍然存在并且不会折叠,因此我的GridView上会有间隙 我需要将GridView项

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

我无法创建另一个
ObservableCollection
来筛选我正在用作
项目资源的
集合。我尝试使用
GridView.ItemContainerStyle
来更改
GridViewItem
样式,但它似乎不适用于绑定(尽管如果我将值设置为Collapsed,它会起作用)


我还尝试使用
DataTemplateSelector
。我可以使用绑定隐藏项目,但由于
项目容器仍然存在并且不会折叠,因此我的
GridView
上会有间隙

我需要将
GridView
项折叠起来,而不仅仅是隐藏起来。

编辑:我为什么要删除已过滤的
可观察集合

我正在尝试使用相同的
itemsource
SelectedItem
镜像2
gridview
和1
ListView
,这两个视图都与我的ViewModel属性
Items
Current
绑定。 如果没有过滤器,它的工作方式与我预期的一样,没有SelectionChanged事件,但只有双向绑定

但是那些
GridView/Listview
必须有一些差异,例如可供选择的项目及其
DataTemplates
。因此,我使用的过滤集合给我带来了问题

例如:

  • GridView1
    包含项目1、2和3
  • GridView2
    只有第1项和第3项
  • 我选择
    GridView1
  • 我选择
    GridView1
当我选择项目1时,它也会在
GridView2
上被选中。现在好了。当我选择项目2时,项目1将在
GridView2
上保持选中状态
GridView2
现在应该没有选择,但是如果我强制它,它将始终取消选择
GridView2
的项目2,因为两者的
SelectedItem
是双向绑定的


我希望这是可以理解的,因为英语不是我的母语。

因此,首先,这种风格不起作用,因为WinRT显然不支持setter中的绑定(请参阅)。这篇文章确实提到了这个问题的解决方法,希望它能为您提供帮助(尽管我自己还没有尝试过)

如果无法实现,GridView最终只是一个ItemsControl,因此您应该能够通过将其ItemsPanel属性设置为自定义面板来手动覆盖布局。您可以制作一个像这样的小型自定义面板,与用于折叠GridViewItems内容的DataTemplateSelector结合使用:

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

这段代码可以稍微清理一下,但是类似这样的东西应该能够解决处理显示的空GridViewItems的问题。

您可以使用item索引从代码后面修改GridViewItem可见性。 项目索引与ObservableCollection中的项目索引相同

var gridViewItem = (GridViewItem)this.GridView.ContainerFromIndex(index);
gridViewItem.Visibility = Visibility.Visible;

为什么你不能创建一个过滤的ObservableCollection?@FilipSkakun Hello Filip。我在问题上添加了解释,因为很难对评论进行解释。如果你需要更多的信息告诉我,我会更新它。Regard在ViewModel中为SelectedItem1和SelectedItem2创建单独的属性。在这些属性的设置器中,检查该值是否在其他集合中。如果是,则将其他SelectedItem设置为该值。如果没有,那么就做接下来发生的事情(要么将其设置为null,要么做其他事情,不确定你的意图是什么)。@NateDiamond+1这很有趣,因为这就是我现在“解决它”所做的。首先,我尝试使用
SelectionChanged
事件,但它带来了其他问题,然后我为绑定创建了
ViewModel
的不同属性。如果我可以更改GridViewItems的可见性,则不必这样做:/无论如何,感谢您的提示。是的,更改GridViewItem的可见性有其自身的问题,因为“default”和“empty”值占用了大量空间,因此您必须进入样式并删除其中的一部分,包括从VisualStates中删除。与过滤相比,肯定要做很多工作。
var gridViewItem = (GridViewItem)this.GridView.ContainerFromIndex(index);
gridViewItem.Visibility = Visibility.Visible;