【发布时间】:2011-04-18 23:06:49
【问题描述】:
在模型层,我定义了一个枚举:
public enum MemberStatus
{
ActiveMember = 0,
InactiveMember = 1,
Associate = 2,
BoardMember = 3,
Alumni = 4
}
在我看来,我有一个组合框,其中填充了这些枚举值:
<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}" />
...
这会导致组合框的选项与枚举中定义的值完全相同。虽然这是我最初的目标,但我希望为用户提供更好的演示,如下所示:
- 组合框选项:
- 活跃成员
- 非活动成员
- 关联
- 董事会成员
- 校友
另外,如果应用程序中的语言发生变化,我需要该语言的枚举值。为了解决这个问题,我首先想到的是为MemberStatus 枚举值创建一个转换器。我发现这篇关于该主题的漂亮文章:http://www.codeproject.com/KB/WPF/FriendlyEnums.aspx 但是 MVVM 模式说几乎根本不需要创建它们——我同意这一点。然而,在这个例子中,这种肯定对我不利。
应该怎么做?谢谢。
【问题讨论】:
-
您从哪里了解到 MVVM 不需要转换器?
-
我会考虑改变设计而不是调整转换器。一个好的解决方案是创建两个类 -
MemberStatus和AvailableMemberStatus。AvailableMemberStatus将扩展List<MemberStatus>并在构造函数中初始化自身。可能作为单例实现。 -
@nlawalker:我在 Josh Smith 的博客和其他几个来源中找到了它。它实际上在 MVVM 讨论中经常被提及。就个人而言,我同意这种说法,因为视图模型的目的是将模型转换为视图——它可能会为视图做好准备。
-
我不同意关于不在 MVVM 中使用转换器的说法。 WPF 广泛使用内置转换器,我经常在我的 MVVM 编程中使用它们。我和他们没有任何问题。我对诸如“但是 MVVM 模式说不应该创建它们”之类的笼统陈述持保留态度。这只是一个人的观点,许多人不同意。