【发布时间】:2016-01-24 17:54:17
【问题描述】:
如何根据ViewModel方法的结果调用MessageBox.Show()?
视图模型
Public Class PersonViewModel
Inherits ViewModels.ViewModelBase 'basic INotifyPropertyChanged staff
Private _Model As Person
Public Property FirstName As String
Public Property LastName As String
'BasicSub is class implemented ICommand taking Execute method as parameter
Public Property SaveCommand As New Commands.BasicSub(AddressOf Me.SaveModel)
Private Sub SaveModel()
If _Model.Save() = False Then
'Here inform View about saving wasn't successful
End If
End Sub
End Class
查看
Public Class PersonView
Inherits Form
'I use BindingSource for bindings
Private BindingSourceViewModel As BindingSource
Public Sub New(viewmodel As Object)
Me.InitializeComponents()
Me.BindingSourceViewModel.DataSource = viewmodel
End Public
End Class
View 有一个按钮,其 Click 事件绑定到 Command 属性
我将 MVVM 理解为简单的关注点分离。
View(在 Winforms 中是 Form)只有自己的逻辑。设计器代码或代码隐藏无关紧要。ViewModel 了解模型但不了解视图。
现在我对如何根据Save 命令/方法的结果调用MessageBox 并同时保持View 和ViewModel 分隔的问题很少出价?
因为 MessageBox.Show 显然是 View 的一部分
目前,我使用的解决方法在我看来打破了MVVM 模式。MessageBox.Show 如果_Model.Save 返回 false,则从 SaveModel() 方法中的 ViewModel 执行。
我已经检查了答案WPF MessageBox with MVVM pattern?,但此时不受使用某些中间类型的影响。我试图将 Views 和 ViewModels 保留在不同的项目中,并且 Views 除了资源之外没有对其他应用程序库的任何引用
@HighCore,我知道Winforms 和WPF 之间的区别:)
【问题讨论】:
-
我不知道这是否是最好的方法,但我通过从 ViewModel 发送消息并在 View 中注册一个处理程序来处理这个问题。通常,您需要做的不仅仅是显示 MessageBox,因此注册处理程序以侦听从 ViewModel 发送的错误消息非常方便,恕我直言……但我并不声称自己是 MVVM 专家。
-
正如 Filburt 所说,你应该使用 messenger 模式,我写了一篇文章解释了这种模式和其他 mvvm 主题:blog.rsuter.com/…
-
以防万一您还没有使用它:MVVM FX / Caliburn.Micro 似乎为 Windows 窗体提供了一个不错的 mvvm 框架。
-
@Filburt,eventhandler 方法,如果我理解正确,意味着 View 需要知道 ViewModel 类型才能订阅事件。在我的例子中,View 将 ViewModel 作为构造函数中
Object类型的参数。 -
@Fabio 不,视图只需要了解消息类型,如果需要,还需要了解消息中包含的(模型)类型。消息类型可以/应该位于专用项目中,并像您的模型类型一样被引用。而且,严格来说,您声明的 Message Handlers 与用于按钮单击事件等的 Commands 不同。