FlexGrid for WPF
データの読み込み
ミュージックライブラリサンプル > データの読み込み

グリッドのデータは、ICollectionView オブジェクトに簡単に読み込むことができます。コードは次のようになります。

コードのコピー
var songs = MediaLibrary.Load();
var view = new MyCollectionView(songs);
using (view.DeferRefresh())
{
  view.GroupDescriptions.Clear();
  view.GroupDescriptions.Add(new PropertyGroupDescription("Artist"));
  view.GroupDescriptions.Add(new PropertyGroupDescription("Album"));
}
var fg = _flexiTunes;
fg.CellFactory = new MusicCellFactory();
fg.MergeManager = null;
fg.Columns["Duration"].ValueConverter = new SongDurationConverter();
fg.Columns["Size"].ValueConverter = new SongSizeConverter();
fg.ItemsSource = view;

このコードは、リソースとして格納されている XML ファイルから曲を読み込む Load ヘルパーメソッドを使用しています。実際のアプリケーションでは、この部分はサーバーから曲目カタログを読み込む Web サービスに置き換えると考えられます。次に、Load メソッドの実装を示します。

コードのコピー
public static List<Song> Load()
{
    var asm = Assembly.GetExecutingAssembly();
    foreach (var resName in asm.GetManifestResourceNames())
    {
        if (resName.EndsWith("data.zip"))
        {
            var zip = new C1.C1Zip.C1ZipFile(asm.GetManifestResourceStream(resName));
            using (var stream = zip.Entries["songs.xml"].OpenReader())
            {
                var xmls = new XmlSerializer(typeof(List<Song>));
                return (List<Song>)xmls.Deserialize(stream);
            }
        }
    }
    throw new Exception("組み込みリソース「data.zip」が見つかりません。");
}

Song クラスには、曲の再生時間(ミリ秒)とサイズ(バイト)が格納されます。これはユーザーへの表示に適した書式ではなく、また、ここでの目的に適した形式に値を変換できるシンプルな .NET 書式文字列はありません。上のコードでは、Column.Format プロパティを設定する代わりに、Duration 列と Size 列に Column.ValueConverter プロパティを設定します。

Column.ValueConverter プロパティには、未加工データ値を列に表示する値に変換するために使用する IValueConverter オブジェクトを指定します。次に、曲の再生時間(ミリ秒)とサイズ(バイト)のコンバータの実装のサンプルを示します。

コードのコピー
// 曲の期間のコンバーター(ミリ秒)。
class SongDurationConverter : IValueConverter
{
  public object Convert(object value, Type targetType,
    object parameter,
    System.Globalization.CultureInfo culture)
  {
    var ts = TimeSpan.FromMilliseconds((long)value);
    return ts.Hours == 0
      ? string.Format("{0:00}:{1:00}", ts.Minutes, ts.Seconds)
      : string.Format("{0:00}:{1:00}:{2:00}",
               ts.Hours, ts.Minutes, ts.Seconds);
  }
  public object ConvertBack(object value, Type targetType,
    object parameter,
    System.Globalization.CultureInfo culture)
  {
    throw new NotImplementedException();
  }
}
// 曲のサイズのコンバーター(x.xx MB を返す)。
class SongSizeConverter : IValueConverter
{
  public object Convert(object value, Type targetType,
    object parameter,
    System.Globalization.CultureInfo culture)
  {
    return string.Format("{0:n2} MB", (long)value / 1024.0 / 1024.0);
  }
  public object ConvertBack(object value, Type targetType,
    object parameter,
    System.Globalization.CultureInfo culture)
  {
    throw new NotImplementedException();
  }
}

最初の値コンバータは、1 時間を超える再生時間に異なる書式を使用します。2 番目の値コンバータは、バイトをメガバイトに変換します。IValueConverter オブジェクトは柔軟でシンプルなので、WPF プログラミングではよく使用されます。

データ連結に関して実行する必要があるのは、これですべてです。以上で、適切な ICollectionView データソース、便利な書式を使って曲名、再生時間、およびサイズを表示する列の準備ができました。

関連トピック