Questions tagged «mvvm»

模型视图ViewModel(MVVM)是一种软件设计中使用的体系结构模式,该模式起源于Microsoft,是Martin Fowler引入的表示模型设计模式的专门化。

10
在什么条件下使用MVVM是合适的?
模型视图视图模型是由Microsoft开发的,目标是支持事件驱动编程的UI开发平台,特别是使用XAML和.NET语言的.NET平台上的Windows Presentation Foundation(WPF)和Silverlight。此后的几年中,许多Javascript框架(例如Angular,Knockout和ExtJS)都采用了这种模式。 像大多数软件模式一样,MVVM具有适当的用途和滥用。在什么条件下使用MVVM是合适的?什么时候不明智?

3
谁应该控制MVVM应用程序中的导航?
例1:我的MVVM应用程序中显示了一个视图(出于讨论目的,请使用Silverlight),然后单击一个按钮,该按钮会将我带到新页面。 示例2:同一视图具有另一个按钮,单击该按钮后应在子窗口(对话框)中打开详细信息视图。 我们知道,将有ViewModel公开的Command对象绑定到按钮,这些对象具有响应用户单击的方法。但是,那又如何呢?我们如何完成该动作?即使我们使用所谓的NavigationService,我们在说什么呢? 更具体地说,在传统的“视图优先”模型(如基于URL的导航方案,例如Web或SL内置导航框架)中,Command对象必须知道接下来要显示的视图。当涉及由模式促进的关注点分离时,这似乎越界了。 另一方面,如果未将按钮连接到Command对象,并且其行为类似于超链接,则可以在标记中定义导航规则。但是我们是否希望Views控制应用程序流,并且导航不只是另一种业务逻辑吗?(在某些情况下我可以说是,在其他情况下我可以说不。) 对我来说,MVVM模式的乌托邦式实现(我听说其他人对此表示赞同)将以一种可以使应用程序无头运行(即无视图)的方式连接ViewModel。这为基于代码的测试提供了最大的表面积,并使Views成为应用程序的真实外观。而且我的ViewModel不在乎它是否显示在主窗口,浮动面板或子窗口中,应该吗? 根据这种方法,在运行时由其他机制来“绑定”应该为每个ViewModel显示的视图。但是,如果我们想与多个ViewModel共享一个View,反之亦然呢? 因此,鉴于需要管理View-ViewModel关系,以便我们知道在视图之间导航时需要显示的内容(包括显示子窗口/对话框),我们如何真正在MVVM模式中完成此操作?

4
如何在给定的MVVM应用程序中选择不使用框架(Caliburn.Micro等)?
我曾经开始一个MVVM / WPF项目,该项目最终得以构建和部署,为此,我研究了很多Caliburn.Micro MVVM框架。事实是:我最终没有为此使用Caliburn.Micro,最终自己实现了一些MVVM概念(特别是ViewModelBaseand RoutedCommand类)。 现在,我按照相同的原则被分配到一个更大的项目:可以说,“单用户富客户端脱机桌面应用程序”,因此我决定使用Caliburn.Micro。这就是我的“问题”开始的地方。 我已经读过一篇著名的博客文章,其标题为“如果您正在使用MVVM,那么您需要一个框架”,即: “在没有框架的情况下尝试进行诸如MVVM之类的工作是一项巨大的工作。大量重复的代码,重新发明轮子,并训练人们以不同的方式思考。 至少在框架下,您可以避免重复的代码,并希望不必重新发明轮子,从而使您可以专注于对人员进行再培训。再培训部分通常是不可避免的,但是框架提供了管道代码和结构,使过程更容易。” 我会同意一读,但是我在Caliburn.Micro(CM)实际应用中的实际经验是无知和迷失方向。也就是说,该框架根本没有使过程变得更容易,相反。阅读由罗布·艾森伯格相当(太)非正式文档中提供不断重复的例子,从旋绕提供的样品试图推断使用模式,他们完全间接的类和接口的关系,这里的东西似乎被设计为工作基础上除非您是一个经验丰富的天才,否则副作用似乎是人类不可能做到的(对不起,这只蚂蚁很抱歉,但我想您知道我的意思)。 更不用说任何上述琐碎的场景似乎都涉及IoC容器,这是我从未使用过的东西,并且似乎解决了我什至没有的问题。我不想花更多的项目时间来学习这些东西,而不必考虑我的问题和应用程序领域。我只想要一个香蕉,但CM给了我一个拿着一篮香蕉的大猩猩(IoC)。 现在,我正在考虑回到我自己家乡的MVVM框架-仅由我实际上要实现的少数特定于MVVM的类组成-我想至少给CM一个机会,以防万一我在这里丢失了一些东西,或者只是出于纯粹的经验和愚昧无知地“错误地”做事。所以问题是: 人们普遍认为“框架使事情变得更加轻松自然”,但是如果碰巧相反,这是否意味着我不应该使用该框架,或者我试图以错误的方式学习它?有没有一个线索,我什至不应该使用框架?还是有一些“正确”的方法来弄清楚如何将CM用于简单的MVVM开发?
28 frameworks  wpf  mvvm 

6
我们应该将视图绑定到模型属性还是ViewModel应该具有它自己的属性?
我正在使用以下技术环境启动一个项目:.Net 4.0,Entity Framework 4.0,带有MVVM体系结构的 WPF 我在网上看到了很多例子,有些书就是关于这种环境的。在某些示例中,作者有以下想法: Viemodel将具有Model类的实例(实体框架实体,例如Person) 将WPF视图控件绑定到Model的属性 虽然有些作者这样做: Viemodel将公开模型的所有属性。 将WPF视图控件绑定到ViewModel的属性,而不是直接绑定到模型。 那么,让视图绑定模型的属性而不是让视图模型公开自己的属性是一个好主意吗?还是更优选?

1
是否有很好的形式化模式来管理MVVM中的状态?
我已经开始了解网络世界中的Redux和React,并且对它的了解越多,我越意识到WPF的MVVM风格的架构在桌面世界中的状态管理是多么痛苦(使用Caliburn专门绑定视图)。到ViewModels)。 Redux有一些简单的原则,指示如何管理状态,从而使UI更新,事件处理和状态更改更加可预测。原则是: 单一事实来源(所有可变状态都存储在单个共享库中)。 状态为只读。组件无法在整个代码中对其进行修改,这通常是WPF中发生的情况。 状态只能通过纯函数进行修改。 WPF的MVVM体系结构允许您非常快速地构建交互式视图,但是当各种视图模型和事件都改变状态时调试问题是一场噩梦。例如:触发了一个事件,该事件更改了视图并尝试设置默认选项卡,但是数据尚未从Web服务异步加载完成,因此该选项卡不存在(尚未),因此没有任何反应 我花了数小时来绘制图表,以尝试理解相互更新的相互关联的viewModels组件之间的复杂交互。 我了解Redux旨在解决这种状态不可预测的问题。是否有类似的东西,或与WPF很好地配合以更好地管理状态的体系结构模式?我不确定Redux原则在.NET中的运行情况如何,因为我还没有尝试过。也许有人有经验可以提供一些建议?
21 wpf  mvvm  state  redux 

5
价值转换器会带来更多麻烦吗?
我正在使用需要大量值转换的视图的WPF应用程序。最初,我的哲学(部分是受到有关XAML信徒的激烈辩论的启发)的,我应该严格按照支持视图数据要求的观点来构建视图模型。这意味着将值转换为可见性,画笔,大小等所需的任何值转换都将由值转换器和多值转换器处理。从概念上讲,这似乎很优雅。视图模型和视图都将具有独特的目的并且可以很好地分离。在“数据”和“外观”之间将划清界限。 好吧,在将这种策略赋予“旧的大学尝试”之后,我有些怀疑是否要继续以这种方式发展。我实际上正在强烈考虑转储值转换器,并将(几乎)所有值转换的责任直接交给视图模型。 使用价值转换器的现实似乎并没有达到完全分开的关注点的表观价值。对于价值转换器,我最大的问题是使用它们很乏味。您必须创建一个新类,实现IValueConverter或IMultiValueConverter,将一个或多个值转换为object正确的类型,进行测试DependencyProperty.Unset(至少对于多值转换器而言),编写转换逻辑,在资源字典中注册转换器 [请参见下面的更新],最后,使用相当冗长的XAML(这要求转换器的绑定和名称都使用魔术字符串)来连接转换器[请参见下面的更新]。调试过程也不是一件容易的事,因为错误消息通常是不明确的,尤其是在Visual Studio的设计模式/ Expression Blend中。 这并不是说替代方案(使视图模型负责所有值转换)是一种改进。这很可能是另一面草更绿的问题。除了失去优雅的关注点分离之外,您还必须编写一堆派生属性,并确保RaisePropertyChanged(() => DerivedProperty)在设置基本属性时认真调用,这可能会带来令人不愉快的维护问题。 以下是我汇总的初始清单,这些清单允许视图模型处理转换逻辑并取消使用值转换器的优缺点: 优点: 由于取消了多转换器,因此总绑定数更少 较少的魔术字符串(绑定路径+转换器资源名称) 无需再注册每个转换器(还要维护此列表) 减少编写每个转换器的工作(无需实现接口或强制转换) 可以轻松注入依赖项以帮助进行转换(例如颜色表) XAML标记不那么冗长,更易于阅读 转换器重用仍然可能(尽管需要一些计划) DependencyProperty.Unset没有神秘问题(我在多值转换器中注意到的一个问题) *删除线表示如果您使用标记扩展,这些好处将消失(请参阅下面的更新) 缺点: 视图模型和视图之间的耦合更强(例如,属性必须处理可见性和画笔之类的概念) 更多的总体属性可允许直接映射视图中的每个绑定 RaisePropertyChanged必须为每个派生属性调用(请参阅下面的更新2) 如果转换基于UI元素的属性,则仍必须依赖转换器 因此,正如您可能会说的那样,我对此问题感到非常沮丧。我非常不愿走重构的道路,只是意识到无论我在视图模型中使用值转换器还是暴露大量的值转换属性,编码过程都是同样低效而乏味的。 我是否缺少任何利弊?对于那些尝试了两种价值转换方式的人,您觉得哪种对您更好,为什么?还有其他选择吗?(门徒提到了有关类型描述符提供程序的一些内容,但是我无法理解他们在说什么。对此的任何见解都将受到赞赏。) 更新资料 我今天发现,可以使用一种称为“标记扩展”的东西来消除注册值转换器的需要。实际上,它不仅消除了注册它们的需要,而且还提供了在您键入时选择转换器的智能感知Converter=。这是让我入门的文章:http : //www.wpftutorial.net/ValueConverters.html。 使用标记扩展的能力在上面我的优缺点列表和讨论中(见删除线)在某种程度上改变了平衡。 作为这个启示的结果,我正在尝试一个混合系统,在该系统中,我将转换器用于BoolToVisibility我所说的内容MatchToVisibility,并将视图模型用于所有其他转换。MatchToVisibility基本上是一个转换器,可以让我检查绑定值(通常是枚举)是否与XAML中指定的一个或多个值匹配。 例: Visibility="{Binding Status, Converter={vc:MatchToVisibility IfTrue=Visible, IfFalse=Hidden, Value1=Finished, Value2=Canceled}}" 基本上,这是检查状态为已完成还是已取消。如果是,那么可见性将设置为“可见”。否则,它将设置为“隐藏”。事实证明,这是非常普遍的情况,使用此转换器可以为我节省约15个属性(以及关联的RaisePropertyChanged语句)。请注意,当您键入时Converter={vc:,“ MatchToVisibility”将显示在智能菜单中。这显着减少了出错的机会,并减少了使用值转换器的麻烦(您不必记住或查找所需值转换器的名称)。 如果您感到好奇,我将在下面粘贴代码。这种实现的一个重要特点MatchToVisibility是,它检查是否绑定的值是一个enum,如果是,它检查,以确保Value1,Value2等也都是相同类型的枚举。这样可以在设计时和运行时检查是否有任何枚举值输入错误。为了将其改进为编译时检查,您可以改用以下代码(我手动输入了此代码,因此,如果我有任何错误,请原谅我): Visibility="{Binding Status, Converter={vc:MatchToVisibility IfTrue={x:Type {win:Visibility.Visible}}, …
20 silverlight  wpf  mvvm  xaml 

2
帮助处理复杂的MVVM(多个视图)
我需要在以下情况下创建视图模型的帮助: 深层次数据 同一数据集的多个视图 每个视图都是基于活动选择的单个动态变化的视图 根据属性的值,在选项卡控件中显示不同类型的选项卡 我的问题: 我应该为每个视图(VM1,VM2等)创建视图模型表示吗? 1. Yes: a. Should I model the entire hierarchical relationship? (ie, SubVM1, HouseVM1, RoomVM1) b. How do I keep all hierarchies in sync? (e.g, adding/removing nodes) 2. No: a. Do I use a huge, single view model that caters for all views? 这是单个视图的示例 …
18 wpf  mvvm 

2
WPF中的MVVM是否已过时?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我目前正在努力争取WPF MVVM的使用-我的意思不是让我的想法成为现实,而是围绕实际工作中的实际要点而不是愚蠢的CRUD做些超越常规的事情。 我注意到的是,很多框架以及大多数/所有博客文章都来自“时代”。 这是因为现在已经过时了,而博客作者已经转向Next Next Thing,还是仅仅因为他们已经说了所有要说的话? 换句话说,我这里缺少什么吗?
18 wpf  mvvm 

5
如何减轻运行时创建视图模型的痛苦
对于这个很长的问题,我深表歉意。我在下面总结了我的问题 在MVC世界中,事情很简单。该模型具有状态,在视图显示模式,并且控制器不东西/与模型(基本上),控制器没有的状态。为了完成这些工作,Controller对Web服务,存储库等有一些依赖性。实例化控制器时,您关心的是提供那些依赖关系,而没有别的。执行动作(Controller上的方法)时,可以使用这些依赖关系来检索或更新Model或调用某些其他域服务。如果存在任何上下文,例如说某些用户想要查看特定项目的详细信息,则将该项目的ID作为参数传递给Action。Controller中的任何地方都没有对任何状态的引用。到目前为止,一切都很好。 输入MVVM。我爱WPF,我喜欢数据绑定。我喜欢使数据绑定到ViewModels更加容易的框架(使用Caliburn Micro atm)。我觉得这个世界上事情并不那么简单。让我们再次做运动:该模型具有状态下,查看显示的视图模型和视图模型做的东西/使用模型(基本),一个视图模型做有状态!(澄清;也许它代表所有属性的一个或多个模型,但是这意味着它必须具有对模型的一种方式或另一种,这本身就是状态的基准)为了做ViewModel在Web服务,存储库等方面有一些依赖性。实例化ViewModel时,您关心的是提供那些依赖关系,还需要提供状态。女士们,先生们,这无休止地困扰着我。 每当您需要从中实例化a ProductDetailsViewModel时ProductSearchViewModel(您又从中实例化了ProductSearchWebServicewhich IEnumerable<ProductDTO>,每个人还和我在一起吗?),您可以执行以下操作之一: call new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);,这很糟糕,想象另外3个依赖关系,这意味着也ProductSearchViewModel需要承担这些依赖关系。改变构造函数也是很痛苦的。 调用_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);,工厂只是一个Func,大多数IoC框架很容易生成它们。我认为这很糟糕,因为Init方法是一个泄漏的抽象。您也不能对Init方法中设置的字段使用readonly关键字。我确定还有更多原因。 呼叫_myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);So ...这是通常建议用于此类问题的模式(抽象工厂)。我虽然是个天才,但它满足了我对静态类型的渴望,直到我真正开始使用它为止。我认为样板代码太多了(除了我使用的荒谬变量名之外,您都知道)。对于每个需要运行时参数的ViewModel,您将获得两个额外的文件(工厂接口和实现),并且需要键入非运行时依赖项,例如额外输入4次。而且,每次依赖关系发生变化时,您也需要在工厂中进行更改。感觉我什至不再使用DI容器。(我认为温莎城堡对此有某种解决方案(有其自身的缺点,如果我错了,请纠正我))。 用匿名类型或字典来做某事。我喜欢我的静态打字。 是的。以这种方式混合状态和行为会产生一个在MVC中根本不存在的问题。我觉得目前还没有一个真正足够的解决方案来解决这个问题。现在,我想观察一些事情: 人们实际上使用了MVVM。因此,他们要么不在乎以上所有内容,要么拥有一些出色的其他解决方案。 我还没有找到带有WPF的MVVM的深入示例。例如,NDDD示例项目极大地帮助我理解了一些DDD概念。如果有人可以将我指向类似MVVM / WPF的方向,我真的很喜欢它。 也许我在做MVVM时出错了,应该将我的设计倒过来。也许我根本不应该有这个问题。好吧,我知道其他人也问过同样的问题,所以我认为我不是唯一的一个。 总结一下 我是否可以正确地得出结论,将ViewModel作为状态和行为的集成点是整个MVVM模式存在某些困难的原因? 使用抽象工厂模式是以静态类型实例化ViewModel的唯一/最佳方法吗? 是否有类似深度参考实现的内容? 是否有很多带有状态/行为的ViewModels设计气味?
17 c#  design  wpf  mvvm 

3
MVVM,DDD和WPF分层应用程序项目结构指南
我正在尝试在VS中设置我的应用程序的结构,我想“尝试”并在将来对其进行合理的证明。该应用程序将是对旧的Winform应用程序的WPF重写,该应用程序没有遵循任何约定。没有层,层,首字母缩略词等。 这是一个相当大的企业应用程序。我计划将Linq To SQL用作数据库,并且很可能始终是MS SQL。我也有一个现有的技能。 我想尽可能地遵循MVVM和DDD,但是结合使用它们时,我对应用程序的结构感到困惑。让我尝试通过一些示例进行说明。 当我遵循MVVM时,我的文件夹结构可能如下所示: Views Models ViewModels Helpers 但是这如何适合于简单的DDD分层方法,其中我的项目结构可能类似于此: MyApp.UI MyApp.Domain MyApp.Data 我应该将其Models放在“域”层中还是有3种说法Person?这就引出了另一个问题,即我将数据库对象的存储库和映射放在哪里?我会假设数据... Views我会进入UI,但ViewModels也会吗? 最后,我将业务逻辑嵌入哪里? 我在CodePlex,DDD示例中发现了以下内容,虽然对您有所帮助,但似乎对Web应用程序有所帮​​助,但这似乎是我的无知。 不要误会我的意思,我知道我可以拥有尽可能多的文件夹,并可以随意命名。我试图弄清楚在哪里放置东西,以便可以扩展,而不是那些地方必须叫什么。 我的问题的核心可能会这样显示。 我有tblPerson产生的物件*.dbml。这很明显,将属于我的“数据”层。 现在,我将拥有Model,DTO,Domain Model或在称为的单独Layer(project?)中调用的任何东西Person。我需要一个Mapper用于Person对tblPerson那个我不知道放在哪里。 然后,我将拥有一个ViewModel,例如,EditPerson它将拥有它自己的属性,Person但可能还会更多。 最后,我将有一个绑定到该ViewModel的View。 需要明确的是,我的假设和猜测已填满该段,我希望有人能为我打气或向他们提供见解,这样从现在开始的6个月到一年内,我不会踢得比自己需要的更多。

3
MVVM澄清
我们将要编写我们的第一个WPF应用程序,并逐渐熟悉MVVM模式。我们已经构建了许多Winform应用程序,并拥有对我们非常成功的体系结构。我们在转换该架构或确定我们的架构的某些部分适合MVVM模型时遇到了一些麻烦。 从历史上看,我们有一个Gui(主exe),然后它可以与BusinessLogic dll通信。BusinessLogic通过Web服务与DAL dll通信,并且DAL与数据库进行交互。DAL,BusinessLogic和GUI都引用相同的BusinessObjects dll。 向MVVM的某些过渡相当简单。我们的Gui将仍然包含视图,我们的BusinessOjbects将仍然包含模型,而我们的DAL将仍然与数据库交互(尽管实现它们的技术可能会发生变化)。 我们不确定的是我们的BusinessLogic组件。从历史上看,这将提供GUI调用的函数,然后在视图中填充控件(即GetCustomerList,它将返回Customer对象或典型的CRUD函数的列表)。 我们主要遇到的问题是MVVM模式是否需要一个附加组件来容纳ViewModels,还是我们只是改变了思维方式并将用作BusinessLogic组件的内容迁移到ViewModels? 我们的BusinessLogic组件代表ViewModels吗?

4
正确的Model-View -_____设计
我一直在阅读有关Model View Controller,Model View Presenter,Model View ViewModel等的内容,通常,基本概念似乎很容易理解:将漂亮的视觉效果和科学胆量保持彼此独立和无知,例如可能。设计巧克力中没有添加逻辑花生酱;酷,我喜欢。 问题是我对于第三部分还是有点模糊,不是模型或视图。每个人似乎都有自己的主意,如何称呼它,应该做什么,什么是正确的,什么是明显的错误……而且我很想弄清楚什么时候Presenter成为ViewModel,什么时候应该让View成为现实。不要这样做,因为那是主持人的工作,并且- 我在乱逛 而不是请别人解释它们之间的区别-因为已经一次又一次地做到了(我知道;我读了不计其数的文章)-我很好奇听到我自己拼凑的模型很少有程序员。 就是说,您会将此设计归类为什么?也许更重要的是,您是否对此有明显的印象?当然,如果这确实是可靠的设计,我很想听到我做的很好,但是我宁愿得到可靠的建议而不是赞美。 注意:我将使用“桥梁”作为Model-View-?的神秘第三部分。避免对其“应该”有任何潜意识的建议。 模型 是对数据的授权。 从网桥接收有关请求的更改的信息。 包含并执行关于数据如何与其他数据相关的所有逻辑。 数据更改时通知网桥(对于网桥表示感兴趣的数据)。文字编辑:允许外部订户(对其一无所知)监视其状态或计算结果。 对视图的知识为零。 视图 与为用户提供查看和操纵数据的方式有关。 从网桥接收有关数据更新的信息。 包含并执行有关如何向用户呈现数据和控件的所有逻辑。 当用户执行了(可能)影响模型的操作时,通知Bridge。 通知Bridge感兴趣的信息。 对模型的知识为零。 桥 是模型和视图之间的协调者和翻译者。 对在模型和视图之间传递的信息进行适当的格式更改。 保留有关“谁需要知道什么”的信息。 具有模型和视图的知识。 补充说明 在更复杂的程序中,通常会有多个模型。在这种情况下,网桥通常承担在多个模型之间进行协调/转换的工作,因此成为应将原型/ API /设计模型构建到哪个模型的权限。(例如,如果构建纸牌游戏程序,并且您要构建备用的甲板改组模型,则应使用Bridge来确定与Bridge正确通信所需的功能。) 在只有一个视图和模型的小型简单程序中,网桥通常会“假定”任一侧都有哪些功能。但是,随着程序变得越来越复杂,建议视图和模型向Bridge报告其功能,这样可以避免效率低下和错误的假设。 我认为这几乎涵盖了它。无论如何,我欢迎您对我倾向于使用的设计有任何疑问,并且我也鼓励您提出任何建议。 和往常一样,感谢您的宝贵时间。

3
MVVM和服务模式
我正在使用MVVM模式构建WPF应用程序。现在,我的视图模型调用服务层以检索模型(与视图模型无关)并将其转换为视图模型。我正在使用构造函数注入将所需的服务传递给viewmodel。 它易于测试,并且适用于几乎没有依赖关系的viewmodel,但是当我尝试为复杂模型创建viewModels时,我就有了一个构造函数,其中注入了很多服务(一个用于检索每个依赖关系和所有可用值的列表)绑定到itemsSource)。我想知道如何处理这样的多种服务,并且仍然拥有一个可以轻松进行单元测试的视图模型。 我在考虑一些解决方案: 创建一个包含所有可用服务作为接口的服务单例(IServices)。示例:Services.Current.XXXService.Retrieve(),Services.Current.YYYService.Retrieve()。这样,我就没有一个包含大量服务参数的庞大构造函数。 为viewModel使用的服务创建外观,并将此对象传递到我的viewmodel的ctor中。但是,然后,我必须为我的每个复合视图模型创建一个外观,这可能会有点多... 您认为实现这种架构的“正确”方法是什么?

2
清洁架构:什么是视图模型?
鲍勃叔叔在他的《清洁架构》一书中说,主持人应该将收到的数据放入他称为“视图模型”的东西中。 这与Model-View-ViewModel(MVVM)设计模式中的“ ViewModel”是一样的吗,还是简单的数据传输对象(DTO)? 如果不是简单的DTO,它与View有何关系?视图是否通过观察者关系从视图获取更新? 我的猜测是它更像是MVVM中的ViewModel,因为罗伯特·马丁(Robert Martin)在他的书的第23章中说: [演示者]的工作是接受来自应用程序的数据并对其进行格式化以进行演示,以便View可以将其简单地移动到屏幕上。例如,如果应用程序希望在字段中显示日期,它将向Presenter传递Date对象。然后,Presenter会将数据格式化为适当的字符串,并将其放置在称为View模型的简单数据结构中,View可以在其中找到它。 这意味着View以某种方式连接到ViewModel,而不是简单地将其作为函数参数接收(例如DTO就是这种情况)。 我认为这是因为,如果您查看图像,演示者将使用视图模型,而不是视图。演示者同时使用输出边界和输出数据DTO。 如果既不是DTO也不是MVVM中的ViewModel,请详细说明它是什么。

2
在MVVM中,ViewModel或View应该负责创建新视图吗?
在我的WPF应用程序中,我想创建一个新视图。在ViewModel或Model中应该在哪里做? 该应用程序是一个(现在非常简单)单窗口形式的工具,带有单个“发送”按钮。如果选中其中一个复选框,则应弹出使用相同ViewModel的新窗口,要求用户提供一些其他详细信息。出于这个问题的目的,我们只考虑新窗口方法,而不考虑显示/隐藏面板之类的其他方法。 理想情况下,在View中应该没有任何代码。此外,由于View中没有任何逻辑,因此VM最初需要检查是否需要创建新视图,并且-在需要时-将这种责任退还给View,从而导致代码膨胀。 另一方面,在ViewModel中创建新视图违反了ViewModel不应该了解View的原则。 因此,在View或ViewModel中创建新视图更好吗?
11 c#  design  wpf  mvvm 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.