Bind Enum to ListControl

当使用MVVM时,相信你和我一样经常有这样的需求:

在ViewModel里定义了一个Enum,它必然是对应UI上的一个ListControl作为不同选项。

有一种做法是使用Converter,将Enum的Values取出用作Binding。但是当Converter数量增长时,你会想是能少一个Converter就少一个。

这里会介绍另一种可以省略一个Converter的做法来实现将Enum的Values取出用作Binding。

How to use:

Step 1: 添加一个ObjectDataProvider

<UserControl>
    <UserControl.Resources>
        <ObjectDataProvider x:Key="MyEnumNameList" MethodName="GetValues" ObjectType="{x:Type system:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="MyNamespaceOfEnum:MyEnum"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </UserControl.Resources>
</UserControl>    

Step 2: 使用新添加的ObjectDataProvider去做binding

<Combobox ItemsSource={StaticResource MyEnumNameList}/>

Step 3: 需要取回选中的enum值时,直接使用SelectedItem就是对应的enum value.

How to work:

ObjectDataProvider继承于DatasourceProvider,可以用作ObjectBinding.

Definitions如下:

例子里用到的两个property是MethodName和MethodParameters. 将例子中的XAML里的definition其实可以翻译以下:

 

Array arr = Enum.GetValues(typeof(MyNamespaceOfEnum:MyEnum));

 

posted @ 2016-09-28 17:33  LARSON _  Views(198)  Comments(0Edit  收藏  举报