Bind Enum to ListControl

时间:2024-01-08 18:22:26

当使用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如下:

Bind Enum to ListControl

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

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