首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM设计注意事项

MVVM设计注意事项
EN

Stack Overflow用户
提问于 2011-02-03 23:54:30
回答 3查看 604关注 0票数 1

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

我准备实现ViewModel类来表示我的应用程序的一个特性。我对模型-视图-视图模型模式非常陌生,我有一个关于在实现ViewModel类时使用哪种方法最好的问题。

从在线示例中,我发现模型通常是ViewModel的成员。通过使用这种方法,ViewModel公开了模型成员的属性,以便它们可以绑定到视图中的模型。

例如:

代码语言:javascript
复制
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中继承模型类而不是使用私有成员。

如下所示:

代码语言:javascript
复制
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类的最佳方法的建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-03 23:58:39

甚至不要考虑从模型继承viewModel -这将是一个没有人会喜欢的技巧。如果你懒得暴露所有的属性(BTW resharper可以自动做到这一点),那么你可以将你的模型包含到你的viewModel中,并通过一些只读属性提供对它的访问。但是您仍然应该在模型类中实现INotifyPropertyChanged

一些代码(对不起,适用于C#):

代码语言:javascript
复制
class Model : INotifyPropertyChanged
{
    public string Name { get; set; } // this raises PropertyChanged
}

class ViewModel
{
    private readonly Model _model;

    public Model Model { get { return _model; } }
}

查看XAML:

代码语言:javascript
复制
<Textbox Text="{Binding Model.Name}" />
票数 3
EN

Stack Overflow用户

发布于 2011-02-04 00:01:59

ViewModel通常包装/封装与视图相关的逻辑。使用ViewModel简单地传递模型数据是不必要的。虽然纯粹的方法是定义一个ViewModel并传递此数据;但在某些情况下,这根本不是必需的,因为应用程序本质上过于简单。如果应用程序有任何增长潜力,那么使用ViewModel将是必要的。

如果您有一个Person模型,则ViewModel通常可能包含一个属性,该属性公开一个名为PeopleObservableCollection<Person>。ViewModel是视图的编排器;而不是模型的通道。

但是,由于上面提到的原因,您不应该将您的模型与ViewModel捆绑在一起,因为它们应该在理论和实践中彼此解耦。

票数 1
EN

Stack Overflow用户

发布于 2011-02-04 02:03:12

看看这张取自here的图表。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4888367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档