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

Joh*_*ink 0 c# enums mvvm xamarin visual-studio-2013

我有一个 Xamarin 项目,它由一个 Models 项目、一个 ViewModels 项目和一个针对要发布应用程序的每个平台的“View”项目组成。Models 项目链接到 View Models 项目,但不(直接)由 Views 项目使用。

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

我现在正在做的是复制/粘贴模型枚举,然后将模型枚举类型转换为 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){
    //...
}
Run Code Online (Sandbox Code Playgroud)

我目前所做的:

//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){
    //...
}
Run Code Online (Sandbox Code Playgroud)

Mei*_*hes 5

嗯,这应该属于 ViewModel 的责任。ViewModel 的全部要点是将模型域转换为视图域能够消化的内容。如果这意味着创建一个新的枚举,那就这样吧。这就是自动映射器发挥作用的地方。

附带说明一下。我发现从视图域之外使用枚举无论如何都是一种不好的模式,因为它将逻辑带入视图中。就我个人而言,我不会公开了解有关枚举类型的任何(直接)信息。如果我需要由于特定的枚举值而导致视图更改行为,那么我可以在 ViewModel 中使用该逻辑。

更新:

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

enum ViewIcons
{ 
    IconOne,
    IconTwo,
}
Run Code Online (Sandbox Code Playgroud)

...从您的您ViewModel可以设置

view.Icon = ViewIcons.IconOne
Run Code Online (Sandbox Code Playgroud)

假设您在 ViewModel 中进行了更新

void Update()
{
    switch(_model.State)
    { 
        case ModelState.Inactive: 
            view.Icon = ViewIcons.IconOne 
...
Run Code Online (Sandbox Code Playgroud)

为什么要这样做呢?好吧,如果您完全删除模型域并用不同的东西替换它(想一想),您只需要重构您的 ViewModel 域。您的视图域类并不明智。