c# - 如何在 ModelView 中防止 WPF 枚举

标签 c# wpf mvvm enums messagebox

目前在我的应用程序中,我使用 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,只有模型、 View 和 View 模型。

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

该实现使用 Func委托(delegate),但您可以使用接口(interface)轻松完成此操作。然后一种方法是创建您自己的枚举,然后将它们转换为接口(interface)的 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
  }
}

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

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

关于c# - 如何在 ModelView 中防止 WPF 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9225703/

相关文章:

wpf - VirtualizingStackPanel 不会清除 ItemTemplate 中 TextBoxes 的文本

.net - 在 WPF 中定义多个时 DataTrigger 不触发

wpf - MVVM + WPF + Popup = 无能为力

c# - 将所有 xml 属性从一个节点复制到另一个节点

c# - 在注入(inject)之前在工厂中调用类的初始化方法是否是一个好的设计选项

.net - RaisePropertyChanged 不起作用

wpf - WPF MVVM TreeView选择的项目未填充当前选择对象

c# - WPF 命令不适用于 MVVM 应用程序中的子菜单项

c# - 如何在 C# 中生成 JavaScript 对象字面量?

c# - 为什么我不能将此对象添加到此列表中?