使用绑定改变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
与相同的ItemsSource
和SelectedItem
都与我的ViewModel属性Items
和Current
绑定。没有过滤器,它就像我期望的那样没有SelectionChanged事件,但只有的双向绑定。
但是这些GridView/Listview
必须有一些差异,比如可供选择的项目和它的DataTemplates
。所以我正在使用过滤集合,这给我带来了问题。
-
GridView1
有条目1、2和3 -
GridView2
只有项目1和3 - 我选择
GridView1
项目1 - 我选择
GridView1
项目2
当我选择项目1时,它也在GridView2
上被选中。现在还好。当我选择项目2时,项目1在GridView2
上保持选中状态。GridView2
现在应该没有选择,但如果我强制它,它将始终取消选择GridView2
的项目2,因为两者的SelectedItem
都是双向绑定的。
我希望你能理解,因为英语不是我的母语。
首先,样式不能工作,因为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;