C# 如何在ModelView中防止WPF枚举

C# 如何在ModelView中防止WPF枚举,c#,wpf,mvvm,enums,messagebox,C#,Wpf,Mvvm,Enums,Messagebox,目前在我的应用程序中,我使用func/lambda方法显示消息框,如下url所述: 传递消息框文本和标题不是问题,但是我也想传递图像框图像和图像框类型(是/否等)。这些是WPF枚举。目前,我编写了一些方法将这些枚举转换为非WPF(自制)枚举,但复制每个值感觉有点乏味 在ViewModel中使用WPF枚举是否可以接受?(我想不是)。如果没有,我如何防止它们被使用,并且仍然在ViewModel中选择它们呢?我对您的术语ModelView和ViewModel有点混淆。使用MVVM,只有模型、视图和视

目前在我的应用程序中,我使用func/lambda方法显示消息框,如下url所述:

传递消息框文本和标题不是问题,但是我也想传递图像框图像和图像框类型(是/否等)。这些是WPF枚举。目前,我编写了一些方法将这些枚举转换为非WPF(自制)枚举,但复制每个值感觉有点乏味


在ViewModel中使用WPF枚举是否可以接受?(我想不是)。如果没有,我如何防止它们被使用,并且仍然在ViewModel中选择它们呢?

我对您的术语ModelView和ViewModel有点混淆。使用MVVM,只有模型、视图和视图模型

这篇文章讨论的是抽象消息框,这样您就可以在构建服务器等待用户交互时运行单元测试,而不会阻塞构建服务器

该实现使用
Func
委托,但您可以使用接口轻松地完成此操作。然后,一种方法是创建自己的枚举,然后将它们转换为接口的MessageBox实现

例如

然后,视图模型将IConfimation作为依赖项(例如在其构造函数中),在单元测试中,您可以存根IConfimation接口,以始终从ShowConfirmation方法返回特定结果


您还可以重载ShowConfirmation方法来提供图像、窗口标题等选项。

我对您的术语ModelView和ViewModel有点混淆。使用MVVM,只有模型、视图和视图模型

这篇文章讨论的是抽象消息框,这样您就可以在构建服务器等待用户交互时运行单元测试,而不会阻塞构建服务器

该实现使用
Func
委托,但您可以使用接口轻松地完成此操作。然后,一种方法是创建自己的枚举,然后将它们转换为接口的MessageBox实现

例如

然后,视图模型将IConfimation作为依赖项(例如在其构造函数中),在单元测试中,您可以存根IConfimation接口,以始终从ShowConfirmation方法返回特定结果


您还可以重载ShowConfirmation方法,以提供图像、窗口标题等选项。

我看不出不这样做的理由。在我看来,ViewModel是模型和视图之间的“粘合剂”。因此,ViewModel自然知道与视图相关的类型。例如,如果我的ViewModel具有背景色属性,则其类型为SolidColorBrush。Imho使用WPF枚举类型没有错。如果您真的不喜欢,多绑定和几个IsXyz属性是另一种想法。:)@多谢你这么做。。。我必须说我喜欢下面的devdigital的答案,但我可能会在以后使用enum转换。我喜欢界面解决方案。我看不出不这样做的理由。在我看来,ViewModel是模型和视图之间的“粘合剂”。因此,ViewModel自然知道与视图相关的类型。例如,如果我的ViewModel具有背景色属性,则其类型为SolidColorBrush。Imho使用WPF枚举类型没有错。如果您真的不喜欢,多绑定和几个IsXyz属性是另一种想法。:)@多谢你这么做。。。我必须说我喜欢下面的devdigital的答案,但我可能会在以后使用enum转换。我喜欢界面解决方案。感谢您的回答,ModelView是一个错误类型(我已经在我的问题中编辑了它)。你的解决方案听起来更不错。当我到那一步时,我必须检查它(我将在一段时间内不进行单元测试,但我可以尝试使用接口;看起来比lamda/func方式更好)。我猜转换总是需要的。虽然我还没有实现单元测试,但解决方案似乎很好,所以我现在已经接受了。感谢您的回答,ModelView是一个错误类型(我已经在问题中编辑了它)。你的解决方案听起来更不错。当我到那一步时,我必须检查它(我将在一段时间内不进行单元测试,但我可以尝试使用接口;看起来比lamda/func方式更好)。我猜转换总是需要的。虽然我还没有实现单元测试,但解决方案似乎不错,所以我现在已经接受了。
public enum ConfirmationResult
{
  Yes,
  No, 
  Cancel
  ..etc
}

public enum ConfirmationType
{
  YesNo,
  OkCancel
  ..etc    
}

public interface IConfirmation
{
  ConfirmationResult ShowConfirmation(string message, ConfirmationType confirmationType)
}

public class MessageBoxConfirmation : IConfirmation
{
  ConfirmationResult ShowConfirmation(string message, ConfirmationType confirmationType)
  {
    // convert ConfirmationType into MessageBox type here
    // MessageBox.Show(...)
    // convert result to ConfirmationResult type
  }
}