【问题标题】:How to access the ViewModel for a View如何访问视图的 ViewModel
【发布时间】:2025-12-08 01:10:01
【问题描述】:

假设我有一个显示一些文本的简单视图。文本通过数据绑定的字符串属性来自视图的 ViewModel。我希望能够通过应用程序中的多个位置设置 ViewModel 的字符串。

在我的应用程序的各个点获取 ViewModel 实例的最佳做法是什么?

我可以将 ViewModel 设为单例,但感觉不对。

有什么建议吗?

【问题讨论】:

    标签: wpf mvvm viewmodel


    【解决方案1】:

    我认为对此有不同的概念。 各有优缺点......

    1.) 如果视图模型的构造函数中没有参数,则可以使用 Control、View、Page 的 DataContext 属性来绑定视图模型。它为每个视图旋转一个实例...

    2.) 如果您有复杂的或组合的视图模型,带有构造函数注入...最好的方法是基于服务定位器模式的 ViewModel 定位器模式。

    http://johnpapa.net/simple-viewmodel-locator-for-mvvm-the-patients-have-left-the-asylum http://blog.roboblob.com/tag/viewmodellocator/

    3.)您必须首先考虑视图或视图模型,并且可能考虑诸如视图模型婚姻之类的事情... http://wildermuth.com/2009/5/22/Which_came_first_the_View_or_the_Model

    HTH

    【讨论】:

      【解决方案2】:

      我认为您正在寻找类似Messenger 的东西,您的视图模型可以在其中注册消息以更改您的字符串属性,而其他组件可以通过信使发送消息。

      另一种方法是PRISM 事件聚合器,您可以在其中订阅应更改字符串属性的事件。

      编辑:另一种但不好的方法是将视图模型的实例提供给所有其他位置。但是你没有更多的松散耦合。

      【讨论】: