如何在ModelView中阻止WPF枚举



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

http://www.deanchalk.me.uk/post/WPF-MVVM-e28093-Simple-e28098MessageBoxShowe28099-With-Action-Func.aspx

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

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

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

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

实现使用Func委托,但是使用接口也可以很容易地实现。然后,一种方法是创建自己的枚举,然后将它们转换为接口的MessageBox实现。

例如

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
  }
}

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

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

最新更新