4

GridViewItemsプロパティバインディングを使用して可視性を変更するにはどうすればよいですか?

ObservableCollectionとして使用しているものをフィルタリングするために別のものを作成することはできませんItemsSourceGridView.ItemContainerStyleスタイルを変更するために使用しようとしましGridViewItemたが、バインドでは機能しないようです (値を Collapsed に設定すると機能します)。

<GridView.ItemContainerStyle>
    <Style TargetType="GridViewItem">
        <Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource booleanToVisibilityConverter}}" />
    </Style>
</GridView.ItemContainerStyle>

も使ってみましたDataTemplateSelector。バインディングを使用してアイテムを非表示にできますが、まだそこにあり、折りたたまれていないGridViewため、隙間があります。ItemContainer

GridViewアイテムを非表示にするだけでなく、折りたたむ必要があります。

編集: filteredを取り除きたいのはなぜObservableCollectionsですか?

GridViews2と 1ListViewを同じものでミラーリングしようとしていますがItemsSourceSelectedItemどちらも ViewModel プロパティItemsCurrent. フィルターがなければ、 SelectionChanged イベントがなくても期待どおりに機能しますが、Two-Way Binding のみで機能します。

ただし、それらGridView/Listviewには、選択可能なアイテムやそのDataTemplates. そのため、問題を引き起こしたフィルター処理されたコレクションを使用しています。

例えば:

  • GridView1項目 1、2、および 3 を含む
  • GridView2項目 1 と 3 のみを持つ
  • の項目 1 を選択しますGridView1
  • の項目 2 を選択しますGridView1

アイテム1を選択すると、それも選択されGridView2ます。とりあえずいい。アイテム 2 を選択すると、アイテム 1 が選択されたままになりGridView2ます。GridView2今は選択なしである必要がありますが、強制すると、両方が双方向にバインドされているGridView2ため、常に項目 2 の選択が解除されます。SelectedItem

英語は私の母国語ではないので、これが理解できることを願っています。

4

2 に答える 2

1

まず、WinRT は明らかにセッターでバインディングをサポートしていないため、スタイルが機能していません (こちらを参照)。この記事には、この問題の回避策が記載されており、うまくいくことを願っています (私自身は試していませんが)。

それがうまくいかない場合、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 を処理する問題を解決できるはずです。

于 2014-02-09T21:43:22.743 に答える
-1

アイテム インデックスを使用して、コード ビハインドから GridViewItem の可視性を変更できます。アイテムのインデックスは、ObservableCollection にあるものと同じです

var gridViewItem = (GridViewItem)this.GridView.ContainerFromIndex(index);
gridViewItem.Visibility = Visibility.Visible;
于 2015-08-08T20:02:38.587 に答える