WPF的复合指南:MVVM与MVP
我很困惑。也许你能帮我:) 我一直遵循CAG的指导,发现MVP模式对我来说非常自然。 假设我有一个UI就绪模型(例如:implements INotifyPropertyChanged),我使用presenter将此模型绑定到视图(presenter知道视图的接口),使代码尽可能小,只处理绑定(模型和命令)属性(或方法)或没有ICommand的控件的事件,在本例中,这些事件将立即委托给演示者WPF的复合指南:MVVM与MVP,wpf,design-patterns,mvvm,mvp,prism,Wpf,Design Patterns,Mvvm,Mvp,Prism,我很困惑。也许你能帮我:) 我一直遵循CAG的指导,发现MVP模式对我来说非常自然。 假设我有一个UI就绪模型(例如:implements INotifyPropertyChanged),我使用presenter将此模型绑定到视图(presenter知道视图的接口),使代码尽可能小,只处理绑定(模型和命令)属性(或方法)或没有ICommand的控件的事件,在本例中,这些事件将立即委托给演示者 过了一段时间,我发现了MVVM模式,但到目前为止我还没有找到它。 据我所知,在我的方法中,我只会在我的模
Ariel如果演示者知道视图的界面,则您需要演示者使用的所有视图具有相同的界面,或者为每个视图创建一个演示者。使用MVVM,视图知道viewModel,viewModel知道模型(但反之亦然)。这意味着多个视图可以使用一个VM,多个VM可以使用一个模型 我不太清楚你在第二点上问的是什么。VM不是视图(或了解视图),对我来说,DataTemplate定义了对象的显示方式。我把我的数据模板放在ResourceDictionary中,它肯定属于视图。在我的虚拟机层中,WPF“东西”的唯一部分是命令 我需要更多的信息来回答你的第三点。如果您对MVVM进行更深入的研究,它可能会自动得到答案
祝你好运。公元3年。看起来您通过在ViewModel中公开模型来重复自己,但您真正做的是抽象模型,以便View只知道这个抽象(View只知道ViewModel)
这是因为对模型的更改不应破坏视图。此外,您的模型可以实现为从不同来源获取数据的多个不同服务。在这种情况下,您不希望View了解所有这些内容,因此除了上面的注释之外,您还创建了另一个抽象-ViewModel。。我想分享一些我个人对差异的理解 通常在MVP中,您有一个视图接口,例如IView,用于抽象实际视图并将数据绑定到这些实际视图。相反,在MVVM中,您通常使用实际视图的DataContext(例如XAML用户控件)进行数据绑定,这与MVP中的IView类似。因此,让我们说,不准确地说,这两种模式的绑定是相似的 主要区别在于Presenter和ViewModel部分。视图模型与演示者非常不同,演示者是UI和模型之间交换数据的桥梁。正如它的名字所指,它实际上是视图的一个模型。ViewModel中公开的数据主要用于UI流程。因此,根据我的理解,在MVVM中,ViewModel是视图的抽象。与之相反,MVP主要使用IView来抽象视图。因此,通常情况下,MVVM中的层数少于MVP,因此您可以编写更少的代码在MVVM中执行相同的工作: MVVM:Model-ViewModel(表示实际视图,即UI)-实际视图 MVP:Model-Presenter(模型和UI之间交换数据的桥梁)-IView(表示实际视图,即UI)-实际视图 MVVM相对于MVP的优势主要基于Microsoft产品中的以下两大特性:
如果将模型看作是从数据访问层或服务(通常被认为是这样)返回的实体,那么你就开始明白为什么需要VIEW模型了。ViewModel设计用于使用视图所需的行为扩展模型
比如说。如果希望能够更改属性,并通过绑定将此更改通知视图,则该属性需要引发某种形式的NotifyPropertyChanged,以便视图能够做出反应。这是典型模型所不具备的行为 在另一个示例中,假设您有一个集合,并且希望在用户单击视图中该项旁边的复选标记时,使用布尔值标记集合中的每个项。您可能需要一个“IsSelected”属性。这是模型不应该提供的行为 但是我知道你是从哪里来的。。。一开始我肯定有问题。当我第一次将模型的内容复制并粘贴到viewmodel中时,我的胃转了过来,但你必须平静地面对这样一个事实:为了让视图正常工作,它需要模型不应该提供的额外行为 无论这是多么不切实际,强制您的WCF类型或LINQ为SQL类型(或