在我的应用程序,我已经得到了若干这个例子,有一个单一的服务(库道,无论),让我们叫它 WidgetService, 注射进入他们。

让我们假设这个这个例子是上市的所有的用户部件。另一个可能的模型,用于编辑/创建一个单一的这些部件。

用户可以查清单的部件 WidgetListView 的支持 WidgetListViewModel 并且点击按钮增加一个新的部件。创建这个新的部件, CreateWidgetViewModel 是新的想和注入的属性的一些用户控件/窗口,因此,通过魔法的DataTemplates显示 CreateWidgetViewModel 在一个 CreateWidgetView.此外,newing的 CreateWidgetViewModel 不一定发生的范围之内 WidgetListViewModel.

WidgetListViewModel 它注射一个实例 WidgetService .的 CreateWidgetViewModel 被注射了这个相同的 WidgetService 实例。

现在,当用户的点击 保存CreateWidgetView保存 方法上的 WidgetService 将可调用和部件将继续存在。现在 WidgetListViewModel 需要通知,有一个新的部件须显示!

长期积累导致对这个问题:我怎么让 WidgetListViewModel 知道,它需要显示的新的小工具?

我见过一个 视频 在这一个家伙从Microsoft做这样的事情使用的一个事件上的服务的视图模型所预订的。然而,倒是,如果该服务的虚荣心的视图模型,然后视图模型不会得到GC会直到服务的GC。我可以添加IDisposable的模型.但后来当/如何处理当的模型只是表示在UI通过DataTemplates?

没有任何人有任何建议,有关这个吗?

为了澄清,我会说我的解释。最近似乔希*史密斯。至少在尽我的。架漂亮的密切匹配,现在Crack.Net 来源。

有帮助吗?

解决方案

好吧,鉴于有许多人来此没有解答我想我会试试看,但我不是在MVVM的专家。

活动似乎是要使用该方式。但是正如你所指出可能存在内存泄漏,如果服务寿命比视图模型。对付这种情况的最好方法是使用弱事件侦听器。

弱活动允许你挂钩到与事件弱引用,使得如果源对象GC'd则源不被事件处理程序保持存活。

其他提示

使用棱镜的( http://www.codeplex.com/CompositeWPF )的 EventAggregator 它使用发布商订户图案,从而提供目标和源元件之间输耦合。完美的正是你所描述的情况。

我使用的观察者模式(又名发布/订阅图案)来解决这个相同问题。我做了一个类我叫EventAggregator其中有所有共享的方法和数据成员。我可以注册在WidgetListViewModel事件并发布在CreateWidgetViewModel一个“窗口小部件创建”事件。您可以有WidgetListViewModel实现IDisposable(更好)注销您的活动或者你可以注销它的Finalize方法。它的工作得非常好,最好的部分是,这两个视图模型并不需要有关于对方的任何想法。

有关更复杂的东西,或者如果你需要支持,你可以实现一个模型视图这将处理这样的使您的应用程序的模式M-MV-VM-V的事情服务,您的应用程序之间的版本差异。这似乎有点矫枉过正,但它可以使问题某些类别更容易维护。我知道我有,我想我已经插入了MV,因为虚拟机之间和撤销代码串扰刚从可笑的几个项目。

有几种选择:

  1. 使用ObservableCollection-这可能是最简单的选择,但是你必须有某种形式的"主人"集合在模式和有UI结合到这个收集直接,这可能不是"干净"的。架构,但它可能是最简单的方法来完成工作。

  2. 使用的事件,并确保清理了之后你自己,不容易做到在。.

  3. 使用某些中间人来自动清洁活动(如其他人的建议),但不要写你自己的,也有很多的缺陷在此,WPF有一个内置在类不会,但我忘了我的名称(如果有人会记住的名字,请离开一个评论)。

  4. 做定期刷新,你有模型类刷新列表的每一个X秒钟,这是唯一的方式得到更新没有某种形式的通知机制你必须要管理。

我与卡梅伦同意使用WeakEvent模式。我已经创建了一个基类为支持WeakEvent模式的视图模型(在我的例子中,我使用的名称PresentationModel)。

您可能会发现我的示例项目有用: http://www.codeplex.com/CompositeExtensions

JBE

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top