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
镜像2gridview
和1ListView
,这两个视图都与我的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;