代码之家  ›  专栏  ›  技术社区  ›  dustyburwell

ViewModel如何知道服务中的数据何时更新?

  •  3
  • dustyburwell  · 技术社区  · 17 年前

    ,注入其中。

    假设其中一个ViewModel是所有用户小部件的列表。另一个可能是ViewModel,用于编辑/创建这些小部件中的一个。

    用户可以在中查看小部件列表 由一个 然后单击一个按钮添加一个新的小部件。要创建此新小部件,请使用 CreateWidgetViewModel CreateWidgetViewModel 在一个 CreateWidgetViewModel 不一定发生在 WidgetListViewModel

    它被注入了 . 这个 CreateWidgetViewModel WidgetService 例子

    CreateWidgetView 拯救 关于 WidgetListViewModel 需要得到通知,有一个新的小部件要显示!

    长期积累导致了一个问题:我如何让 知道它需要显示新的小部件吗?

    我看过一部电影 Video 其中一个来自微软的家伙使用ViewModel订阅的服务上的事件来做这类事情。然而,这种方法的缺点是,如果服务比viewmodel寿命长,那么viewmodel将无法获得GC'd,直到服务被GC'd。我可以将IDisposable添加到ViewModel。但是,当ViewModel仅通过DataTemplates在UI中表示时,何时/如何调用Dispose?

    为了澄清,我想说我对MVVM的解释与Josh Smith的最为相似。至少我的MVVM架构与Crack.Net源代码中的架构非常接近。

    5 回复  |  直到 17 年前
        1
  •  1
  •   Cameron MacFarland    17 年前

    好吧,鉴于目前还没有答案,我想我应该试试,但我不是MVVM方面的专家。

    Weak Events 允许您连接到具有弱引用的事件,以便如果源对象是GC'd的,则事件处理程序不会保持源的活动状态。

        2
  •  1
  •   PaulJ    17 年前

    使用棱镜( http://www.codeplex.com/CompositeWPF 事件聚合器

        3
  •  0
  •   Bryan Anderson    17 年前

    我用了 Observer Pattern (也称为发布/订阅模式)来解决同样的问题。我创建了一个名为EventAggregator的类,它拥有所有共享的方法和数据成员。我可以在WidgetListViewModel上注册事件,并在CreateWidgetViewModel中发布“Widget Created”事件。您可以让WidgetListViewModel实现IDisposable(更好)来注销事件,也可以在Finalize方法中注销事件。它运行得非常好,最好的部分是两个视图模型不需要对彼此有任何了解。

        4
  •  0
  •   Nir    17 年前

    有几种选择:

    1. 使用ObservableCollection——这可能是最简单的选择,但您必须在模型中有某种“主”集合,并让UI直接绑定到此集合,这可能不是“干净”的MVVM体系结构,但它可能是完成任务的最简单方法。

    2. 使用事件并确保您在自己之后进行清理,这在MVVM中不容易做到。

    3. 使用一些中间人来自动清理事件(如其他人所建议的),但不要编写自己的,这里面有很多陷阱,WPF有一个内置的类可以这样做,但我忘记了名称(如果有人记得名称,请留下评论)。

    4. 定期刷新,让ViewModel类每X秒刷新一次列表,这是获得更新的唯一方法,而无需管理某种通知机制。

        5
  •  0
  •   jbe jbe    17 年前

    我同意Cameron的观点,他使用了弱化的模式。我已经为ViewModel创建了一个基类(在我的示例中,我使用名称PresentationModel),该基类支持事件模式。

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