我目前正在开发一个新的WPF应用程序,并有我的大部分业务逻辑层开发(即我的模型)。
我准备实现ViewModel类来表示我的应用程序的一个特性。我对模型-视图-视图模型模式非常陌生,我有一个关于在实现ViewModel类时使用哪种方法最好的问题。
从在线示例中,我发现模型通常是ViewModel的成员。通过使用这种方法,ViewModel公开了模型成员的属性,以便它们可以绑定到视图中的模型。
例如:
Public Class MyViewModel
Implements INotifyPropertyChanged
Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Private _myModel As ModelClass
Public Property MyModelPropertyA As Object
Get
Return _myModel.MyModelPropertyA
End Get
Set(ByVal value As Object)
_myModel.MyModelPropertyA = value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("MyModelPropertyA")
End Set
Public Property MyModelPropertyB As Object
Get
Return _myModel.MyModelPropertyB
End Get
Set(ByVal value As Object)
_myModel.MyModelPropertyB = value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("MyModelPropertyB")
End Set
'.... And so On'
End Class我不喜欢这种方法的原因是,我将重写许多属性。
因此,我正在考虑在ViewModel中继承模型类而不是使用私有成员。
如下所示:
Public Class MyViewModel
Inherits MyModel
Implements INotifyPropertyChanged
Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
'Now all of my properties are inherited'
End Class第二种方法的问题是,我不确定如何在应用程序运行时将模型转换为视图模型。
您不能设置viewModelInstance = ModelInstance。
(但您可以设置modelInstance = viewModelInstance)
我正在寻找关于如何实现ViewModel类的最佳方法的建议。
发布于 2011-02-03 23:58:39
甚至不要考虑从模型继承viewModel -这将是一个没有人会喜欢的技巧。如果你懒得暴露所有的属性(BTW resharper可以自动做到这一点),那么你可以将你的模型包含到你的viewModel中,并通过一些只读属性提供对它的访问。但是您仍然应该在模型类中实现INotifyPropertyChanged。
一些代码(对不起,适用于C#):
class Model : INotifyPropertyChanged
{
public string Name { get; set; } // this raises PropertyChanged
}
class ViewModel
{
private readonly Model _model;
public Model Model { get { return _model; } }
}查看XAML:
<Textbox Text="{Binding Model.Name}" />发布于 2011-02-04 00:01:59
ViewModel通常包装/封装与视图相关的逻辑。使用ViewModel简单地传递模型数据是不必要的。虽然纯粹的方法是定义一个ViewModel并传递此数据;但在某些情况下,这根本不是必需的,因为应用程序本质上过于简单。如果应用程序有任何增长潜力,那么使用ViewModel将是必要的。
如果您有一个Person模型,则ViewModel通常可能包含一个属性,该属性公开一个名为People的ObservableCollection<Person>。ViewModel是视图的编排器;而不是模型的通道。
但是,由于上面提到的原因,您不应该将您的模型与ViewModel捆绑在一起,因为它们应该在理论和实践中彼此解耦。
发布于 2011-02-04 02:03:12
看看这张取自here的图表。

这是一个很好的参考图表,可以确保您正确地遵循模式。正如您所看到的,层之间的交互方式多种多样,但最主要的是这种分离。始终确保每个层只知道它的父层,而不知道它的子层,即VM知道模型,但不知道视图,并且模型知道业务层,而不是视图模型或视图。
正如您从箭头中看到的(以及其他人提到的),模型可以“通过视图模型上的单个属性公开”,这意味着视图可以通过它直接链接到模型,或者可以在vm上“在模型属性中抽象或重新实现模型”。
https://stackoverflow.com/questions/4888367
复制相似问题