[WPF]BindingのPathにEnum型のインデクサを指定する

WPFはBindingに始まりBindingに終わるといっても
過言ではない。気がする。
今回はコレクション要素のバインドについて。

例えば配列の0番目の要素に対してバインドしたいときは
Hoge=”{Binding Path=PiyoArray[0]}”
と書けばできてしまう。

さてでは、Dictionaryとかを使って、キーにEnum(列挙型)の定数を
指定したいときはどうやって書けばよいだろう。

えらいもんで、探せばやってくれてる人がいるもんだな。

binding to value in Dictionary with enum as a key

上のページで十分わかりやすいと思うけど、
もう少しシンプルな例で(変わんねえかな)書いておく。

まず適当なEnum型。

public enum MyEnum
{
    Zero,
    Key1,
    Key2,
    Key3,
}

このEnumがKeyのDictionaryをプロパティに持つDataContextクラス。

public class ViewModel
{
    public Dictionary<MyEnum, string> MyDic { get; private set; }

    public ViewModel()
    {
        MyDic = new Dictionary<MyEnum, string>
        {
            { MyEnum.Zero, "000" },
            { MyEnum.Key1, "111" },
            { MyEnum.Key2, "222" },
            { MyEnum.Key3, "333" },
        };
    }
}

そしてXAML。

<Window x:Class="BindingToEnumIndexerSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:BindingToEnumIndexerSample"
        Title="MainWindow" Height="200" Width="200">
    <StackPanel Orientation="Vertical">
        <TextBlock Text="{Binding Path=MyDic[(local:MyEnum)Key1]}" />
        <TextBlock Text="{Binding Path=MyDic[(local:MyEnum)Key2]}" />
        <TextBlock Text="{Binding Path=MyDic[(local:MyEnum)Key3]}" />
    </StackPanel>
</Window>

キャストみたいな書き方をするのね。

ふつう、Bindingの「Path=」は省略できるんだけど、
上記の例だとなぜか省略できなかった。
細かいルールがあるのだろうきっと。

MainWindowのDataContextにこのViewModelオブジェクトをいれて起動すると
↓こんな感じ。
BindToEnumIndexer