当使用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));