【发布时间】:2013-08-31 19:14:19
【问题描述】:
我已经阅读了各种将模型数据更改传达给视图模型的方法。 有人建议模型应该尽可能实现 INotifyPropertyChanged,以便它可以通知视图模型更改的属性。有人建议在模型和视图模型之间建立一个服务层,服务层实现 INPC,方法调用通过该服务层路由到模型,以便服务层通知视图模型。
我认为后者是前者的更细化的修订版,并已开始在我的模型类中实现 INPC。感觉不对,因为
a) 我现在必须在我的视图模型中为来自模型的通知编写一个事件处理程序。 这采用长开关(propertyName)的形式,它在视图模型上设置相应的属性,导致 NPC 再次向上发送。我觉得我在这里写了很多样板代码。
b) 视图模型现在通过一堆字符串耦合到我的模型,这些字符串完全由约定规范,即没有定义“接口”。更不用说这给 IDE 带来的困难了。
c) 我的模型必须修改以适应这种情况!如果由于某种原因关闭了怎么办?我认为这样的模式旨在提高代码的可重用性和关注点的分离。不仅如此,触发 INPC 事件所需的代码也是乏味和重复的,而且不是真正抽象的。
我真的很想知道 WPF 专业人员如何通过依赖属性等来解决这个问题。我觉得我错过了一些东西。我不热衷于使用想要“从头开始”学习的框架。 我已经离开 WPF 一两年了,最近使用 AngularJS 让我质疑我的方法。
谢谢!
【问题讨论】:
-
Model到底指的是什么?您是指业务对象/数据类型类、与数据源连接的代码,还是两者兼而有之? -
我指的是业务数据和功能。在这种情况下,我的模型类是“Test”(属性如“Description”、“Result”,方法如“Run”)和“TestPlan”,VM 为“TestViewModel”“TestPlanViewModel”。
-
您的模型不需要 INPC,只需要您的视图模型。这就是你的虚拟机的全部意义——我见过人们把 INPC 放在他们的模型中,但我觉得它只是把它变成了一个视图模型,而不是一个模型。
-
+1。我已经为此苦苦挣扎了一段时间,最终我选择了选项a)。它确实是样板代码,但我发现这比打破模块化更可取。我通常发现,在回答这个问题时,人们倾向于说
ViewModel应该检查来自Model的更新而不是被通知,但是如果我的Model在后台异步咀嚼,我不会希望不得不坐在那里“轮询”它以获取更新。如果存在更好的解决方案,我很乐意改用更清洁的东西。 -
您不必在您的虚拟机中使用凌乱的观察者 (
This takes the form of a long switch(propertyName))。使用This 之类的东西,你会省去一些麻烦
标签: c# wpf mvvm dependency-properties inotifypropertychanged