关于在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
。
如能就这些问题提供任何建议或意见,我们将不胜感激。我对编程还是相当陌生的,我想学习从长远来看对我有用的技术。
如果我在这里做的事情没有明显的问题,也请告诉我。
谢谢。
从视图模型中引用其他视图模型被认为是不正确的。这打破了本应使项目更具可测试性和可维护性的解耦。如果我需要从许多视图模型中访问属性,我会创建一个类似iUniversalAppDataService的服务,然后在创建vewimodel时使用MVVM Light中内置的依赖项注入来解决问题。
这是你的视图模型的构造函数:
public New(IUniversalAppDataService AppDataService)
{
_MyAppDataService = AppDataService;
}
这样,实现该服务的任何视图模型都可以使用该服务中的任何更改/属性。
服务也需要在viewmodellocator中声明:
SimpleIoc.Default.Register<IUniversalAppDataService , UniversalAppDataService >
我已经使用这种方法创建了响应用户导航的导航服务,当然还有来自数据库或web数据服务的数据服务。我强烈建议使用这种服务方法,因为如果底层数据模型或应用程序架构发生变化,从长远来看,它更容易维护。