Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF的复合指南:MVVM与MVP_Wpf_Design Patterns_Mvvm_Mvp_Prism - Fatal编程技术网

WPF的复合指南:MVVM与MVP

WPF的复合指南:MVVM与MVP,wpf,design-patterns,mvvm,mvp,prism,Wpf,Design Patterns,Mvvm,Mvp,Prism,我很困惑。也许你能帮我:) 我一直遵循CAG的指导,发现MVP模式对我来说非常自然。 假设我有一个UI就绪模型(例如:implements INotifyPropertyChanged),我使用presenter将此模型绑定到视图(presenter知道视图的接口),使代码尽可能小,只处理绑定(模型和命令)属性(或方法)或没有ICommand的控件的事件,在本例中,这些事件将立即委托给演示者 过了一段时间,我发现了MVVM模式,但到目前为止我还没有找到它。 据我所知,在我的方法中,我只会在我的模

我很困惑。也许你能帮我:)

我一直遵循CAG的指导,发现MVP模式对我来说非常自然。 假设我有一个UI就绪模型(例如:implements INotifyPropertyChanged),我使用presenter将此模型绑定到视图(presenter知道视图的接口),使代码尽可能小,只处理绑定(模型和命令)属性(或方法)或没有ICommand的控件的事件,在本例中,这些事件将立即委托给演示者

  • 过了一段时间,我发现了MVVM模式,但到目前为止我还没有找到它。 据我所知,在我的方法中,我只会在我的模型还没有准备好UI时使用MVVM。但是,如果保留演示者而仅仅使用一个新的模型是否更合理,我无法理解这种用法会给我带来什么损失。 我知道我错过了什么,但那是什么:)

  • 此外,当您的视图是通用视图并且可以处理多种模型时(例如在PropertyGrid中)。建议将ViewModel与DataTemplate一起使用,但在这种情况下,您无法为模型中的每个实体创建模板,只需要在运行时对其进行调查,您会推荐什么

  • 当看到Josh Smith在a中谈论MVVM时,我有一种感觉,在ViewModel中重新暴露模型违反了DRY(不要重复你自己),这真的是不可避免的吗?与火焰相比,没有人会为它争论,这让我感到惊讶

  • 希望这足够清楚

    谢谢


    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产品中的以下两大特性:

  • 在WPF中指挥。虽然已经有一些实现不在Silverlight运行时中,但它将来可能在Silverlight中可用

  • WPF和Silverlight中的DataContext

  • 关于#3,很多人会使用“另一层间接”的论点,说模型中的更改不会影响视图。虽然这在技术上是正确的,但这并不是这样做的真正原因

    如果将模型看作是从数据访问层或服务(通常被认为是这样)返回的实体,那么你就开始明白为什么需要VIEW模型了。ViewModel设计用于使用视图所需的行为扩展模型

    比如说。如果希望能够更改属性,并通过绑定将此更改通知视图,则该属性需要引发某种形式的NotifyPropertyChanged,以便视图能够做出反应。这是典型模型所不具备的行为

    在另一个示例中,假设您有一个集合,并且希望在用户单击视图中该项旁边的复选标记时,使用布尔值标记集合中的每个项。您可能需要一个“IsSelected”属性。这是模型不应该提供的行为

    但是我知道你是从哪里来的。。。一开始我肯定有问题。当我第一次将模型的内容复制并粘贴到viewmodel中时,我的胃转了过来,但你必须平静地面对这样一个事实:为了让视图正常工作,它需要模型不应该提供的额外行为

    无论这是多么不切实际,强制您的WCF类型或LINQ为SQL类型(或