じゃがいも畑

開発ネタの記録

C# WPF enumに属性を付けてComboBoxにバインドして便利に使う

参考元

こちらの記事を参考にさせていただきました

qiita.com

qiita.com

できること

↓のような感じで項目名と属性で追加情報を付けたenumを定義しておけば

        public enum Fruit
        {
            未選択,
            [Price("\\150"), Color(KnownColor.Red), ResourceName("apple.png")]
            りんご,
            [Price("\\80"), Color(KnownColor.Yellow), ResourceName("banana.png")]
            ばなな,
            [Price("\\120"), Color(KnownColor.Orange), ResourceName("orange.png")]
            みかん
        }


項目名をそのままコンボボックスで使ったり、追加情報を簡単に取得することができるようになります f:id:whitedog0215:20200421235318g:plain

ソースコード

ソースコードはこちら github.com

ポイント

属性の定義方法や必要な拡張メソッド等は参考記事を参照してください

(参考記事内のコードスニペットattrgを使用させていただきました)


  • 定義した属性をenumに付与しています
  • enumの項目名に名前、属性には価格、色、リソースの画像を付けています
        public enum Fruit
        {
            未選択,
            [Price("\\150"), Color(KnownColor.Red), ResourceName("apple.png")]
            りんご,
            [Price("\\80"), Color(KnownColor.Yellow), ResourceName("banana.png")]
            ばなな,
            [Price("\\120"), Color(KnownColor.Orange), ResourceName("orange.png")]
            みかん
        }


  • enumで列挙した値をすべて取り出して、コンボボックスのデータソースに追加します
            DataSource = new ReactiveCollection<Fruit>();

            foreach (Fruit g in Enum.GetValues(typeof(Fruit)))
            {
                DataSource.Add(g);
            }


  • コンボボックスの選択が切り替わったときに呼ばれるメソッドです
  • 新しく選択されたenumの値が"g"に入っているので、enumの拡張メソッドを使って追加情報を取り出しています
            SelectedItem.Subscribe(g =>
            {
                ItemName.Value = $"Item : {g}";
                ItemPrice.Value = $"Price : {g.GetPrice()}";
                ItemColor.Value = $"Color : {g.GetColor()} ";
                SelectedColor.Value = g.GetColor().ToMediaColor();
                ItemImage.Value = new Uri($"..\\Resource\\{g.GetResourceName()}", UriKind.Relative);
            });