如何使用属性绑定更改GridViewItems
可见性?
我无法创建另一个ObservableCollection
来过滤我使用的ItemsSource
。我尝试使用GridView.ItemContainerStyle
来更改GridViewItem
样式,但似乎它不能用于绑定(尽管如果我将值设置为Collapsed它会起作用)。
<GridView.ItemContainerStyle>
<Style TargetType="GridViewItem">
<Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource booleanToVisibilityConverter}}" />
</Style>
</GridView.ItemContainerStyle>
我还尝试使用DataTemplateSelector
。我可以隐藏带有绑定的项目但是我的GridView
上存在空白,因为ItemContainer
仍然存在且不会崩溃。
我需要将GridView
个项目折叠,而不仅仅是隐藏。
编辑:为什么我要摆脱过滤的ObservableCollections
?
我正在尝试镜像2 GridViews
和1 ListView
,其中ItemsSource
和SelectedItem
与我的ViewModel属性Items
绑定Current
和{{1} }}。
没有过滤器,它可以正常工作,没有SelectionChanged事件,但只有双向绑定。
但是那些GridView/Listview
必须有一些差异,例如可供选择的项目及其DataTemplates
。所以我使用的过滤集合给我带来了麻烦。
例如:
GridView1
有第1,2和3项GridView2
只有第1项和第3项GridView1
GridView1
当我选择第1项时,它也会在GridView2
上被选中。现在很好。当我选择第2项时,第1项在GridView2
上保持选中状态。 GridView2
现在应该没有选择,但是如果我强制它,它将始终取消选择GridView2
的第2项,因为两者的SelectedItem
是双向绑定。
我希望这是可以理解的,因为英语不是我的母语。
答案 0 :(得分:1)
首先,风格不起作用,因为WinRT显然不支持setter中的绑定(参见here)。本文确实提到了这个问题的解决方法,希望它对你有用(虽然我自己没有尝试过)。
如果没有平移,GridView最终只是一个ItemsControl,因此您应该能够通过将其ItemsPanel属性设置为自定义面板来手动覆盖布局。您可以将这样的小型自定义面板与您的DataTemplateSelector一起使用,该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
}
}
}
这段代码可以稍微清理一下,但是这样的东西应该可以解决处理显示的空GridViewItems的问题。
答案 1 :(得分:-1)
您可以使用项索引从后面的代码修改GridViewItem可见性。 项索引与ObservableCollection中的项索引相同
var gridViewItem = (GridViewItem)this.GridView.ContainerFromIndex(index);
gridViewItem.Visibility = Visibility.Visible;