C# 在C中暴露ViewModel中模型的枚举#

C# 在C中暴露ViewModel中模型的枚举#,c#,mvvm,enums,visual-studio-2013,xamarin,C#,Mvvm,Enums,Visual Studio 2013,Xamarin,我有一个Xamarin项目,它由一个模型项目、一个ViewModels项目和一个“视图”项目组成,用于发布应用程序的每个平台。模型项目链接到视图模型项目,但视图项目不(直接)使用 问题是,我想在视图中使用模型项目中的一对枚举,而没有将视图项目链接到模型。是否有方法公开这些枚举类型以供查看 我现在做的是复制/粘贴,然后在ViewModel中将模型枚举强制转换为相同的枚举,但这感觉有点像黑客,如果在模型中添加了新的枚举,而不是ViewModel,则可能会破坏某些内容。除了创建一个新的常量/枚举项目并

我有一个Xamarin项目,它由一个模型项目、一个ViewModels项目和一个“视图”项目组成,用于发布应用程序的每个平台。模型项目链接到视图模型项目,但视图项目不(直接)使用

问题是,我想在视图中使用模型项目中的一对枚举,而没有将视图项目链接到模型。是否有方法公开这些枚举类型以供查看

我现在做的是复制/粘贴,然后在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){
    //...
}

将它们添加到第四个名为
Common
Shared
之类的项目中。这不是一个罕见的问题,我一直都是这样解决的

将它们添加到第四个名为
Common
Shared
或类似项目中。这不是一个罕见的问题,我一直都是这样解决的

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

旁注。我发现在视图域之外使用枚举有点不好,因为它会将逻辑引入视图。就我个人而言,我不会让视图知道(直接)有关枚举类型的任何信息。如果由于特定的枚举值而需要视图更改行为,那么ViewModel中就有了该逻辑

更新:

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

enum ViewIcons
{ 
    IconOne,
    IconTwo,
}
。。。从您的
视图模型中可以设置

view.Icon = ViewIcons.IconOne
因此,让我们假设您在ViewModel中进行了更新

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

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

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

旁注。我发现在视图域之外使用枚举有点不好,因为它会将逻辑引入视图。就我个人而言,我不会让视图知道(直接)有关枚举类型的任何信息。如果由于特定的枚举值而需要视图更改行为,那么ViewModel中就有了该逻辑

更新:

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

enum ViewIcons
{ 
    IconOne,
    IconTwo,
}
。。。从您的
视图模型中可以设置

view.Icon = ViewIcons.IconOne
因此,让我们假设您在ViewModel中进行了更新

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

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

为什么视图不应该知道模型?为什么视图不应该知道模型?我们使用枚举的原因是它们告诉视图在不同对象旁边显示哪个图标,而ViewModel不知道图标。另一种方法是将其反转。创建定义案例的视图域枚举。然后ViewModel在它们之间映射
View.IconState=Automapper.Map(_modalStatus)
。同样,MVVM设计的全部要点是拥有ViewModel桥接模型和视图,因此它应该知道这两个域,而不将它们彼此公开。因此,为了确保我理解,这仍然需要将枚举从模型复制到ViewModel?在这种情况下,Automapper如何优于直排版?(同样在你的回答中,我相信你想要一个单独的=in CanSave=_status==…)我已经更新了。不,您没有复制枚举。您正在分离您的视图和关注点。视图的枚举可以不同于模型的枚举,视图模型的任务是在它们之间进行转换。在这种情况下,我们的实现与您的实现几乎是相同的概念。事实证明,我们选择的图标与模型中的枚举完全匹配,因此复制/类型转换完成了同样的任务。我会记下你的答案,因为从技术上讲这是正确的。作为记录,我想要的实际上是向视图公开模型枚举(作为此操作的快捷方式),但是如果视图和模型应该像这样分开,我将保持原样。我们使用枚举的原因是,它们告诉视图在不同的对象旁边显示哪个图标,而且ViewModel不知道图标。另一种方法是反转图标。创建定义案例的视图域枚举。然后ViewModel在它们之间映射
View.IconState=Automapper.Map(_modalStatus)
。同样,MVVM设计的全部要点是拥有ViewModel桥接模型和视图,因此它应该知道这两个具有