关于在MVVM中适当使用ViewModelLocator的问题

本文关键字:ViewModelLocator 问题 MVVM | 更新日期: 2023-09-27 18:25:54

我正在使用MVVM Light开发WPF/MVVM应用程序。现在我的ViewModelLocator是相当标准的;它包括一个CCD_ 2构造函数,该构造函数通过CCD_。

我不知道这有多合适,但我一直在探索在ViewModels中使用ViewModelLocator实例来访问其他ViewModels的属性,并在我的一个视图中更改ContentControl。如果这样做有任何重大问题,请告诉我,这样我就可以找到解决问题的方法。例如,我可能在ViewModel中有一些东西,比如:

private ViewModelLocator _viewModelLocator = new ViewModelLocator();
private void SomeMethod()
{
    _viewModelLocator.OtherViewModel.SomeProperty = something;
}

在另一个ViewModel中,我有以下内容:

private ViewModelLocator _viewModelLocator = new ViewModelLocator();
public ViewModelBase CurrentViewModel { get; set; }
private void SomeMethod()
{
    CurrentViewModel = _viewModelLocator.SomeViewModel;
}

在这种情况下,在我看来,CurrentViewModel绑定到ContentControl

目前,能够做到这一点非常方便,但我想从更有经验的程序员那里得到一些意见,以确保我不会对自己不利。如果它有问题,我是否可以采取更可接受的路线来实现同样的结果?


现在,如果上述方法没有错,我想知道将ViewModelLocator设为static是否合适和/或可接受。为了尝试一下,我快速切换到static ViewModelLocator。在MainWindow.xaml中,我将DataContext设置为:

DataContext="{Binding Source={x:Static vm:ViewModelLocator.Main}}"

回到第一个例子,我可以使用:

private void SomeMethod()
{
    ViewModelLocator.OtherViewModel.SomeProperty = something;
}

和:

public ViewModelBase CurrentViewModel { get; set; }
private void SomeMethod()
{
    CurrentViewModel = ViewModelLocator.SomeViewModel;
}

目前,该程序使用static ViewModelLocator运行良好,但它还处于起步阶段,所以我想知道这在未来是否是一个可行的选择,或者我是否应该完全远离static ViewModelLocator

如能就这些问题提供任何建议或意见,我们将不胜感激。我对编程还是相当陌生的,我想学习从长远来看对我有用的技术。

如果我在这里做的事情没有明显的问题,也请告诉我。

谢谢。

关于在MVVM中适当使用ViewModelLocator的问题

从视图模型中引用其他视图模型被认为是不正确的。这打破了本应使项目更具可测试性和可维护性的解耦。如果我需要从许多视图模型中访问属性,我会创建一个类似iUniversalAppDataService的服务,然后在创建vewimodel时使用MVVM Light中内置的依赖项注入来解决问题。

这是你的视图模型的构造函数:

public New(IUniversalAppDataService AppDataService)
{
    _MyAppDataService = AppDataService;
}

这样,实现该服务的任何视图模型都可以使用该服务中的任何更改/属性。

服务也需要在viewmodellocator中声明:

SimpleIoc.Default.Register<IUniversalAppDataService , UniversalAppDataService >

我已经使用这种方法创建了响应用户导航的导航服务,当然还有来自数据库或web数据服务的数据服务。我强烈建议使用这种服务方法,因为如果底层数据模型或应用程序架构发生变化,从长远来看,它更容易维护。

相关文章:
  • 没有找到相关文章