OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

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