【问题标题】:Access MVVM Light ViewModelLocator from code从代码访问 MVVM Light ViewModelLocator
【发布时间】:2016-02-03 22:41:21
【问题描述】:

我正在尝试使用 MVVM Light Toolkit 实现一个应用程序,但不知何故我被 ViewModelLocator 卡住了。

虽然我很清楚如何从 XAML 中的视图和视图的代码隐藏中访问它,但我在从其他视图模型访问它时遇到了一些问题。

在 App.xaml 中:

<Application.Resources>
  <vm:ViewModelLocatorTemplate xmlns:vm="clr-namespace:MvvmLight1.ViewModel" x:Key="Locator" />
</Application.Resources>

在视图中:

DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"

但是如何从其他视图模型访问例如 MainViewModel? ViewModelLocator sn-ps 的先前版本似乎对不同的视图模型有一个静态方法。但是那些不再存在了,所以我认为这不是要走的路。但究竟是什么?或者,如果我想从视图模型访问定位器,我是否完全违反了模式?

【问题讨论】:

    标签: c# .net wpf mvvm-light


    【解决方案1】:

    Depechie 的回答是正确的,建议您使用 IoC 容器以与 ViewModelLocator 相同的方式检索 ViewModel。

    不过,我将提出另一种方法,该方法将检索 ViewModel,其方式与在 XAML 中完成的方式相同。

    XAML (Page.xaml)

    DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"
    

    代码(Page.xaml.cs)

    this.DataContext = (App.Current.Resources["Locator"] as ViewModelLocator).ViewModelName
    

    上面的 XAML 和 Code 是等价的。我希望这可以帮助您了解应用程序检索 ViewModel 的过程。

    【讨论】:

    • 这应该是正确的答案。 Depechie 的回答是反模式。
    • 您缺少一个开口(在 App.Current 之前。
    【解决方案2】:

    取决于您如何设置视图模型定位器,但通常您应该使用 IOC 容器来注册所有不同的视图模型。

    例如,当使用 MVVM Light 之一时,它会是这样的: SimpleIoc.Default.Register&lt;MainViewModel&gt;();

    因此,当它可用时,您可以在任何其他类中使用它 - 在另一个视图模型中也可以使用: SimpleIoc.Default.GetInstance&lt;MainViewModel&gt;();

    或者,如果您告诉 ServiceLocator 您正在使用 SimpleIoc,它将是这样的: (注册) ServiceLocator.SetLocatorProvider(() =&gt; SimpleIoc.Default);

    然后拿回来 ServiceLocator.Current.GetInstance&lt;MainViewModel&gt;();

    【讨论】:

    • 是的,这种代码在 ViewModelLocator 内部。所以你的建议是直接使用 SimpleIoc 而不是 ViewModelLocator 类?
    • 是的,因为这就是您首先添加 Ioc 的原因 :) 用于“注入”,以便在任何其他类中使用这些类实例。
    猜你喜欢
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多