在C#中使用ViewModel中的模型公开枚举

时间:2014-06-19 19:34:25

标签: c# mvvm enums visual-studio-2013 xamarin

我有一个Xamarin项目,它由一个模型项目,一个ViewModels项目和一个" View"应用程序即将发布的每个平台的项目。 Models项目链接到View Models项目,但View项目没有(直接)使用。

问题是我在Models项目中有一对enums,我想在Views中使用它们,而不将Views项目链接到Model。有没有办法将这些枚举类型公开给View?

我现在正在做的是复制/粘贴,然后在ViewModel中将模型枚举类型转换为相同的枚举,但是如果向模型中添加了新的枚举但是感觉很糟糕并且可能会破坏某些内容不是ViewModel。有没有更好的解决方案,除了创建一个新的常量/枚举项目,我们将所有其他项链接到?

我想做什么:

//MODEL Project
enum MyEnum{
    enum1,
    enum2
}
class ModelObject{
    MyEnum status;
}

//VIEWMODEL Project
class VMObject{
    MyEnum status = modelObject.status;
}

//VIEW Project
if(vmObject.status == MyEnum.enum1){
    //...
}

我目前的工作:

//MODEL Project
enum MyEnum{
    enum1,
    enum2
}
class ModelObject{
    MyEnum status;
}

//VIEWMODEL Project
enum MyVMEnum{
    enum1,
    enum2
}
class VMObject{
    MyVMEnum status = (MyVMEnum)modelObject.status;
}
//VIEW Project
if(vmObject.status == MyVMEnum.enum1){
    //...
}

2 个答案:

答案 0 :(得分:4)

这应该由ViewModel负责。 ViewModel的重点是将您的模型域转换为视图域能够消化的内容。如果这意味着制作一个新的枚举,那就这样吧。这是automapper帮助的地方。

旁注。我发现使用来自视域外部的枚举无论如何都是一个糟糕的模式,因为它将逻辑带入视图中。就个人而言,我不会将视图公开(直接)了解枚举类型。如果我需要由于特定的枚举值而具有视图更改行为,那么我在ViewModel中具有该逻辑。

更新:

View的目标应该是删除所有业务逻辑。因此,在您的情况下,您说您希望视图根据某些模型状态更改其图标。您似乎面临的问题是您不希望视图直接访问模型枚举类型。所以不要,并扭转你的想法。有一个使用自己的枚举的视图:

enum ViewIcons
{ 
    IconOne,
    IconTwo,
}

...来自您的ViewModel可以设置

view.Icon = ViewIcons.IconOne

让我们在您的ViewModel中进行更新

void Update()
{
    switch(_model.State)
    { 
        case ModelState.Inactive: 
            view.Icon = ViewIcons.IconOne 
...

为什么这样?好吧,如果你完全删除你的模型域并用不同的东西替换它(考虑一下),你只需要重构你的ViewModel域。您的View域类不是明智的。

答案 1 :(得分:0)

将它们添加到名为CommonShared的第四个项目中。这不是一个不常见的问题,这就是我一直在解决的问题。