FlexGrid for WPF
グループ化
ミュージックライブラリサンプル > グループ化

データ連結コードは、データソースの GroupDescriptions プロパティに値を挿入することにより、既に基本的なグループ化機能をカバーしています。これによってグリッドは、アルバムとアーティストによって曲をグループ化し、グループに関する基本情報を含む折りたたみ可能なグループ行を表示することができます。

ここでは、カタログを自動的に折りたたみ/展開するボタンを追加して、アーティストのみ(完全に折りたたまれたグループ)、アーティストとアルバム(中間状態)、またはアーティスト、アルバム、および曲(完全に展開されたグループ)を表示することにより、グループ化機能をさらに強化します。

そのために、グリッド上にアーティスト、アルバム、および曲の 3 つのボタンを追加しました。これらのボタンのイベントハンドラは、以下のように実装されます。

コードのコピー
// グループの展開・折りたたみ
void _btnShowArtists_Click(object sender, RoutedEventArgs e)
{
  ShowOutline(0);
}
void _btnShowAlbums_Click(object sender, RoutedEventArgs e)
{
  ShowOutline(1);
}
void _btnShowSongs_Click(object sender, RoutedEventArgs e)
{
  ShowOutline(int.MaxValue);
}

これによってわかるように、すべてのイベントハンドラは同じ ShowOutline ヘルパーメソッドを使用します。最初のボタンはレベルゼロのすべてのグループ行(アーティスト)を折りたたみ、2 つ目のボタンはレベルゼロのグループ(アーティスト)を展開してレベル 1(アルバム)を折りたたみます。3 つ目のボタンはすべてのグループ行を展開します。次に、ShowOutline メソッドの実装を示します。

コードのコピー
void ShowOutline(int level)
{
  var rows = _flexiTunes.Rows;
  using (rows.DeferNotifications())
  {
    foreach (var gr in rows.OfType<GroupRow>())
    {
      gr.IsCollapsed = gr.Level >= level;
    }
  }
}

このメソッドは簡単です。まず、グリッドの RowCollection クラスを取得し、ICollectionView インターフェイスで使用したメカニズムと同じ DeferNotifications を実装します。このメカニズムは、Windows フォームアプリケーションでよく使用される BeginUpdate/EndUpdate パターンに似ており、パフォーマンスの大幅な向上をもたらします。

次に、このコードは LINQ OfType 演算子を使用して、Rows コレクションからすべての GroupRow オブジェクトを取得します。これは通常の行が自動的に除外されるので、すべてのグループ行のレベルをチェックし、各グループ行のレベルに基づいてその IsCollapsed 状態を更新できます。

関連トピック