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

时间:2013-05-08 14:47:38

标签: c# xaml data-binding windows-runtime windows-store-apps

如何使用属性绑定更改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,其中ItemsSourceSelectedItem与我的ViewModel属性Items绑定Current和{{1} }}。 没有过滤器,它可以正常工作,没有SelectionChanged事件,但只有双向绑定

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

例如:

  • GridView1有第1,2和3项
  • GridView2只有第1项和第3项
  • 我选择了GridView1
  • 的第1项
  • 我选择了GridView1
  • 的第2项

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

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

2 个答案:

答案 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;