.net 使用MVVM模式在Winforms中显示MessageBox

.net 使用MVVM模式在Winforms中显示MessageBox,.net,winforms,mvvm,.net,Winforms,Mvvm,如何根据ViewModel方法的结果调用MessageBox.Show() 视图模型 公共类PersonViewModel 继承ViewModels.ViewModelBase的基本INotifyPropertyChanged staff 作为人的私人(Private)模型 公共属性FirstName作为字符串 公共属性LastName作为字符串 'BasicSub是类实现的ICommand,以Execute方法为参数 公共属性SaveCommand作为新命令.BasicSub(AddressO

如何根据
ViewModel
方法的结果调用
MessageBox.Show()

视图模型

公共类PersonViewModel
继承ViewModels.ViewModelBase的基本INotifyPropertyChanged staff
作为人的私人(Private)模型
公共属性FirstName作为字符串
公共属性LastName作为字符串
'BasicSub是类实现的ICommand,以Execute方法为参数
公共属性SaveCommand作为新命令.BasicSub(AddressOf Me.SaveModel)
私有子存储模型()
如果_Model.Save()=False,则
'此处通知有关保存的视图未成功
如果结束
端接头
末级
看法

公共类PersonView
继承形式
'我使用BindingSource进行绑定
私有BindingSourceViewModel作为BindingSource
公共子新建(viewmodel作为对象)
Me.InitializeComponents()的缩写
Me.BindingSourceViewModel.DataSource=viewmodel
终端公众
末级
视图中有一个按钮,用于单击绑定到命令属性的事件

我将MVVM理解为简单的关注点分离。
视图(在Winforms中,这是表单)只有自己的逻辑。设计器代码或codebehind不重要。
ViewModel
了解模型,但不了解视图

现在,我对如何在保持
View
ViewModel
分离的情况下,基于
Save
命令/方法的结果调用
MessageBox
进行了一些讨论 因为MessageBox.Show显然是视图的一部分

此时,我使用了一种变通方法,根据我的意见,它打破了
MVVM
模式。
MessageBox.Show
如果
\u Model.Save
返回false,则从视图模型内部执行
SaveModel()
方法

我已经检查了答案,但目前并没有受到使用一些中间类型的影响。我试图将视图和视图模型保留在不同的项目中,视图除了参考资料外,没有任何对其他应用程序库的引用


@HighCore,我知道
Winforms
WPF
之间的区别:)

作为视觉元素,任何消息框实际上都是视图的一部分。因此,如果您直接从
ViewModel
显示消息框(定义一个调用
MessageBox.show()方法的命令),这个简单的代码将打破MVVM的主要概念-ViewModels不能引用视图-并使您无法为ViewModel编写单元测试。要克服这个困难,您可以使用服务概念。服务是一种IOC概念,它删除ViewModel和视图层之间的任何引用。在代码中,服务是ViewModel代码中使用的一个接口,没有任何“何时”和“如何”实现该接口的假设:

Public Class PersonViewModel
    Protected ReadOnly Property MessageBoxService() As IMessageBoxService
        Get 
            Return Me.GetService(Of IMessageBoxService)()
        End Get 
    End Property
    Public Sub Save()
        If Not _Model.Save() Then
            MessageBoxService.Show("Something wrong!")            
        End If
    End Sub 
End Class
您可以使用DI/IoC为视图模型提供
IMessageBoxService
实现


另外,如果您使用的是DevXPress WinForms控件,您可以使用一些很酷的东西来扩展MVVM应用程序,例如-所有这些都完全适合WinForms环境。

作为视觉元素,任何消息框实际上都是视图的一部分。因此,如果您直接从
ViewModel
显示消息框(定义一个调用
MessageBox.show()方法的命令),这个简单的代码将打破MVVM的主要概念-ViewModels不能引用视图-并使您无法为ViewModel编写单元测试。要克服这个困难,您可以使用服务概念。服务是一种IOC概念,它删除ViewModel和视图层之间的任何引用。在代码中,服务是ViewModel代码中使用的一个接口,没有任何“何时”和“如何”实现该接口的假设:

Public Class PersonViewModel
    Protected ReadOnly Property MessageBoxService() As IMessageBoxService
        Get 
            Return Me.GetService(Of IMessageBoxService)()
        End Get 
    End Property
    Public Sub Save()
        If Not _Model.Save() Then
            MessageBoxService.Show("Something wrong!")            
        End If
    End Sub 
End Class
您可以使用DI/IoC为视图模型提供
IMessageBoxService
实现


另外,如果您使用的是DevXPress WinForms控件,您可以使用一些很酷的东西来扩展MVVM应用程序,例如-所有这些都完全适合WinForms环境。

作为视觉元素,任何消息框实际上都是视图的一部分。因此,如果您直接从
ViewModel
显示消息框(定义一个调用
MessageBox.show()方法的命令),这个简单的代码将打破MVVM的主要概念-ViewModels不能引用视图-并使您无法为ViewModel编写单元测试。要克服这个困难,您可以使用服务概念。服务是一种IOC概念,它删除ViewModel和视图层之间的任何引用。在代码中,服务是ViewModel代码中使用的一个接口,没有任何“何时”和“如何”实现该接口的假设:

Public Class PersonViewModel
    Protected ReadOnly Property MessageBoxService() As IMessageBoxService
        Get 
            Return Me.GetService(Of IMessageBoxService)()
        End Get 
    End Property
    Public Sub Save()
        If Not _Model.Save() Then
            MessageBoxService.Show("Something wrong!")            
        End If
    End Sub 
End Class
您可以使用DI/IoC为视图模型提供
IMessageBoxService
实现


另外,如果您使用的是DevXPress WinForms控件,您可以使用一些很酷的东西来扩展MVVM应用程序,例如-所有这些都完全适合WinForms环境。

作为视觉元素,任何消息框实际上都是视图的一部分。因此,如果您直接从
ViewModel
显示消息框(定义一个调用
MessageBox.show()方法的命令),这个简单的代码将打破MVVM的主要概念-ViewModels不能引用视图-并使您无法为ViewModel编写单元测试。要克服这个困难,您可以使用服务概念。服务是一种IOC概念,它删除ViewModel和视图层之间的任何引用。在代码中,服务是ViewModel代码中使用的一个接口,没有任何“何时”和“如何”实现该接口的假设:

Public Class PersonViewModel
    Protected ReadOnly Property MessageBoxService() As IMessageBoxService
        Get 
            Return Me.GetService(Of IMessageBoxService)()
        End Get 
    End Property
    Public Sub Save()
        If Not _Model.Save() Then
            MessageBoxService.Show("Something wrong!")            
        End If
    End Sub 
End Class
您可以使用DI/IoC为视图模型提供
IMessageBoxService
实现

另外,如果您使用的是DevXPress WinForms控件,您可以使用一些非常酷的东西来扩展您的MVVM应用程序,例如-所有完全适合WinForms环境的应用程序