WPF:MVVM对转换器说不,但我需要很好的枚举值

Bor*_*ris 8 wpf xaml mvvm

在模型层中,我定义了一个枚举:

public enum MemberStatus
{
    ActiveMember = 0,
    InactiveMember = 1, 
    Associate = 2,
    BoardMember = 3,
    Alumni = 4
}
Run Code Online (Sandbox Code Playgroud)

在我看来,我有一个组合框,其中填充了这些枚举值:

<UserControl.Resources>

  <ObjectDataProvider 
      x:Key="memberStatusesDataProvider" 
      ObjectType="{x:Type system:Enum}" 
      MethodName="GetValues">
    <ObjectDataProvider.MethodParameters>
      <x:Type TypeName="model:MemberStatus" />
    </ObjectDataProvider.MethodParameters>
  </ObjectDataProvider>

</UserControl.Resources>
...
<ComboBox 
    ItemsSource="{Binding Source={StaticResource memberStatusesDataProvider}}" 
    SelectedItem="{Binding Path=Status}" />
...
Run Code Online (Sandbox Code Playgroud)

这导致组合框的选择与枚举中定义的值完全相同.虽然这是我最初的目标,但我希望为用户提供更好的演示,如下所示:

  • 组合框选择:
    • 活跃成员
    • 不活跃的成员
    • 关联
    • 董事会成员
    • 校友

此外,如果应用程序中的语言发生更改,我需要使用该语言的枚举值.为了解决这个问题,我想到的第一件事就是为MemberStatus枚举值创建一个转换器.我在这个主题上发现了这篇美丽的文章:http://www.codeproject.com/KB/WPF/FriendlyEnums.aspx但是MVVM模式表明根本不应该创建它们 - 我同意这一点.但是,在这个例子中,这种肯定对我没有用.

它应该如何完成?谢谢.

Dav*_*all 4

MVVM 使价值转换器过时的观点似乎来自 Josh Smith,他在博客文章《MVVM 的哲学》中说道:

... ViewModel 类本质上是一个类固醇值转换器,因此使 IValueConverter 接口与大多数绑定无关。

我从中得出的结论(我同意他的观点)是视图模型负责从模型的世界观到视图的所有转换,从而使转换器过时。

在暴露给 UI 的模型中使用枚举(这是一种非常以数据为中心的数据类型)绝对是一种味道 - 如果只是出于您所看到的原因,向用户显示不太理想的信息。

将枚举到 UI 字符串的映射放入视图模型中。