【问题标题】:Blendability for ViewModel instances in MVVM LightMVVM Light 中 ViewModel 实例的可混合性
【发布时间】:2013-08-07 12:08:39
【问题描述】:

我以前使用过 MVVM,但 MVVM-Light 让我很困惑,所以如果这是愚蠢的,我很抱歉(只是几乎没有任何文档)。

无论如何,我了解到您将 ViewModelLocator 仅用于来自 Laurent 的回答 here 的“单例”视图。

那么如何处理不在定位器中的视图模型?因为我似乎失去了 MVVM-Light 的优势。

我现在要做的是转到视图的代码隐藏并为我的视图模型创建一个依赖属性并将我的数据上下文设置为它。

有没有更好的方法?因为我没有任何可混合性(Visual Studio 和 ReSharper 甚至无法识别 XAML 编辑器中的数据上下文)。更不用说我没有要设计的虚拟数据。

换句话说:
从我所看到的可混合性来自于找到定位器的依赖注入,那么当你不使用定位器时你会怎么做?

【问题讨论】:

  • AFAIK 你可以通过传递一个唯一的密钥来获取一个新的 VM 实例,同时从 ServiceLocator 解析 VM。您不必为了单例而不得不使用 VMLocator。
  • This 显示了基于 uniqueKey 请求新 VM 并在视图关闭时释放它们的示例。检查 MainWindow 代码隐藏部分。至于how could I bind a view-model instance to the view (that's not in the locator),不确定我是否遵循这一点,但您可以在视图的代码隐藏构造函数中设置DataContext = new MyDummyVM();,或者如果您希望它仅用于设计时,您可以使用MVVM lightif (ViewModelBase.IsInDesignModeStatic) DataContext = new MyDummyVM();
  • @Viv 我想我明白了!非常欢迎您将其发布为获得代表的答案。我将测试并尝试立即使用此信息。

标签: c# wpf mvvm mvvm-light


【解决方案1】:

将我的评论转换为答案

AFAIK 在从 ServiceLocator 解析 VM 时,您可以通过传递唯一密钥来获取新的 VM 实例。您不必为了单例而不得不使用 VMLocator。

您可以从Here 获得此过程的示例。在MainWindow.xaml.cs 中,当请求一个新的非模态窗口时,每个视图实例都与对应的VM 的一个新实例耦合在一起,可以在代码隐藏中找到。

如何将视图模型实例绑定到视图(不在定位器中)

^^ 不确定这是否是您所追求的,但是使用 MVVM Light(用于设计时间 VM),您可以在检查是否处于设计模式后在其构造函数中设置视图的 DataContext

类似:

using GalaSoft.MvvmLight;
...

public MainWindow() {
  InitializeComponent();
  if (ViewModelBase.IsInDesignModeStatic)
    DataContext = new MainViewModel();
}

【讨论】:

  • 太棒了!再次感谢你。我的意思是如果视图从定位器获取视图模型,我如何将现有视图模型绑定到视图。但我很愚蠢,没有仔细考虑,然后意识到“只需设置数据上下文”。我现在已经尝试过了,它就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多