データ連結コードは、データソースの GroupDescriptions プロパティに値を挿入することにより、既に基本的なグループ化機能をカバーしています。これによってグリッドは、アルバムとアーティストによって曲をグループ化し、グループに関する基本情報を含む折りたたみ可能なグループ行を表示することができます。
ここでは、カタログを自動的に折りたたみ/展開するボタンを追加して、アーティストのみ(完全に折りたたまれたグループ)、アーティストとアルバム(中間状態)、またはアーティスト、アルバム、および曲(完全に展開されたグループ)を表示することにより、グループ化機能をさらに強化します。
そのために、グリッド上にアーティスト、アルバム、および曲の 3 つのボタンを追加しました。これらのボタンのイベントハンドラは、以下のように実装されます。
これによってわかるように、すべてのイベントハンドラは同じ ShowOutline ヘルパーメソッドを使用します。最初のボタンはレベルゼロのすべてのグループ行(アーティスト)を折りたたみ、2 つ目のボタンはレベルゼロのグループ(アーティスト)を展開してレベル 1(アルバム)を折りたたみます。3 つ目のボタンはすべてのグループ行を展開します。次に、ShowOutline メソッドの実装を示します。
このメソッドは簡単です。まず、グリッドの RowCollection クラスを取得し、ICollectionView インターフェイスで使用したメカニズムと同じ DeferNotifications を実装します。このメカニズムは、Windows フォームアプリケーションでよく使用される BeginUpdate/EndUpdate パターンに似ており、パフォーマンスの大幅な向上をもたらします。
次に、このコードは LINQ OfType 演算子を使用して、Rows コレクションからすべての GroupRow オブジェクトを取得します。これは通常の行が自動的に除外されるので、すべてのグループ行のレベルをチェックし、各グループ行のレベルに基づいてその IsCollapsed 状態を更新できます。