2

比較的単純なアプリケーションのために、(コードビハインドではなく)Xamlで可能な限り多くのことを実行しようとしています。DataGridをSilverlight4のDomainDataSourceにバインドし、DomainDataSourceのGroupDescriptorsをComboBoxesにバインドして、ユーザーが選択した値に従ってDataGridの行をグループ化できるようにします。ボタンをクリックしてすべてのグループを折りたたんだり展開したりできるようにしたいと思います。これはPagedCollectionViewを使用して実行できることはわかっていますが、コードビハインドでグループ化などを実行することになります。PagedCollectionViewを使用せずにこれを実現する方法はありますか?

DataGrid.CollapseRowGroup(CollectionViewGroup collectionViewGroup、bool CollapseAllSubgroups)メソッドを認識していますが、トップレベルのグループを反復処理する方法が見つかりません。

4

1 に答える 1

0

これが私が思いついたものです。すべてのレベルまたは特定のレベルを展開または折りたたむ柔軟性を提供します。(必要に応じて、これをリファクタリングして重複コードを削除できます。) 1回の呼び出しですべてのレベルのすべてのグループを展開または折りたたむには、groupingLevelパラメーターに「0」、collapseAllSublevelsパラメーターに「true」を渡すだけです。HashSetを使用することにより、重複は「グループ」コレクションから自動的に削除されます。

    /// <summary>
    /// Collapse all groups at a specific grouping level.
    /// </summary>
    /// <param name="groupingLevel">The grouping level to collapse. Level 0 is the top level. Level 1 is the next level, etc.</param>
    /// <param name="collapseAllSublevels">Indicates whether levels below the specified level should also be collapsed. The default is "false".</param>
    private void CollapseGroups(int groupingLevel, bool collapseAllSublevels = false)
    {
        if (myGrid.ItemsSource == null)
            return;
        HashSet<CollectionViewGroup> groups = new HashSet<CollectionViewGroup>();
        foreach (object item in myGrid.ItemsSource)
            groups.Add(myGrid.GetGroupFromItem(item, groupingLevel));
        foreach (CollectionViewGroup group in groups)
            myGrid.CollapseRowGroup(group, collapseAllSublevels);
    }

    /// <summary>
    /// Expand all groups at a specific grouping level.
    /// </summary>
    /// <param name="groupingLevel">The grouping level to expand. Level 0 is the top level. Level 1 is the next level, etc.</param>
    /// <param name="expandAllSublevels">Indicates whether levels below the specified level should also be expanded. The default is "false".</param>
    private void ExpandGroups(int groupingLevel, bool expandAllSublevels = false)
    {
        if (myGrid.ItemsSource == null)
            return;
        HashSet<CollectionViewGroup> groups = new HashSet<CollectionViewGroup>();
        foreach (object item in myGrid.ItemsSource)
            groups.Add(myGrid.GetGroupFromItem(item, groupingLevel));
        foreach (CollectionViewGroup group in groups)
            myGrid.ExpandRowGroup(group, expandAllSublevels);
    }
于 2011-07-27T17:31:55.367 に答える