MVVM设计考虑因素

时间:2011-02-03 15:54:30

标签: .net wpf vb.net mvvm viewmodel

我目前正在开发一个新的WPF应用程序,并开发了我的大部分业务逻辑层(即我的模型)。

我是关于实现ViewModel类来表示我的应用程序的一个功能。我对Model-View-ViewModel模式很陌生,我对在实现ViewModel类时最好使用哪种方法有疑问。

从在线示例中我发现模型通常是ViewModel的成员。使用此方法,ViewModel公开Model-member的属性,以便它们可以绑定到View中的Model。

例如:

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类的最佳方法的建议。

3 个答案:

答案 0 :(得分:3)

甚至不要考虑从模型继承你的viewModel - 这将是一个没人会喜欢的hack。如果你太懒,那么暴露所有属性(BTW resharper可以自动完成),那么你可以将你的模型包含在你的viewModel中,并通过一些readonly属性提供对它的访问。但是你仍然应该在模型类中实现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}" />

答案 1 :(得分:1)

ViewModel通常将逻辑关系包装/封装到View。使用ViewModel来简单地传递Model数据是不需要的恕我直言。纯粹的方法是定义ViewModel并传递这些数据;在某些情况下,这根本不需要,因为应用程序本质上是简单的。如果应用程序具有任何增长潜力,那么使用ViewModel将是必要的。

如果您有Person型号; ViewModel通常可以包含公开名为ObservableCollection<Person>的{​​{1}}的属性。 ViewModel是View的协调器;不是模型的传递。

但是,出于上述原因,您不应该将模型与ViewModel绑定,因为它们应该在理论和实践中彼此分离。

答案 2 :(得分:1)

查看摘自here

的图表

enter image description here

这是一个很好的图表,以确保您正确遵循模式。正如您所看到的,层之间有多种交互方式,但主要是分离。始终确保每个层只知道它的父层而不是它的子层,即VM知道模型而不知道视图,并且模型知道业务层而不是视图模型或视图。

从箭头(以及其他提到的)中可以看到,模型可以“通过viewmodel上的单个属性公开”,这意味着视图可以通过此方式直接链接到模型,或者模型可以在vm上“在模型属性中抽象或重新实现”。