gpt4 book ai didi

xaml - ViewModelLocator MVVM Light 中的 ViewModel

转载 作者:行者123 更新时间:2023-12-03 08:31:02 24 4
gpt4 key购买 nike

将我所有的 ViewModel 存储在 SimpleIoc 中是否正确?例如,我有三个页面 MainPage、Photos、Directories(因此三个 ViewModels -> MainVM、PhotosVM、DirectoriesVM)。我应该将每个页面中的 DataContext 设置为 ViewModelLocator 中的 View Model Property 还是将 ViewModels 作为属性嵌套在 MainVM 中并将每个页面 DataContext 绑定(bind)到 Main.PhotosVMProperty、Main.DirectoriesVMProperty 等等?谁能解释一下 IoC 的想法和目的?

最佳答案

首先,让我们看看 ViewModelLocator 做了什么以及我们为什么使用它:

ViewModelLocator 在我们的 App.xaml 页面上被声明为一个对象,并且是一个应用程序单例。我们将拥有一个,并且只有一个在应用程序运行时可供应用程序使用。

ViewModelLocator 是 MVVM Light 中所有 ViewModel 的来源。对于每个 ViewModel,我们在 ViewModelLocator 上都有一个属性,它允许我们获取 View 的 ViewModel。此代码如下所示:

public class ViewModelLocator
{
public MainPageViewModel MainPage
{
get { return new MainPageViewModel(); }
}
}

这是我的 App.xaml 的一部分:
<Application.Resources>
<vm:ViewModelLocator
x:Key="ViewModelLocator" />
</Application.Resources>

这是 View.xaml 的一部分
DataContext="{Binding MainPage, Source={StaticResource ViewModelLocator}}"

到现在为止还挺好。要回答您的第一个问题,您是否必须在 MVVM Light 中使用 Ioc?不,没有必要,因为您的 View 模型将提供给由 ViewModelLocator 完全构建和实例化的 View 。

现在,关于您的第二个问题:IoC 的目的是什么?

IoC 旨在允许您执行以下操作:

使用 Mvvm Light,您可以像这样执行上述操作:
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
}
else
{
SimpleIoc.Default.Register<IDataService, DataService>();
}

SimpleIoc.Default.Register<MainViewModel>();
}

public MainViewModel Main
{
get { return SimpleIoc.Default.GetInstance<MainViewModel>(); }
}
}

public class MainViewModel
{
public ObservableCollection<Foo> Foos { get; set; }

public MainViewModel(IDataService dataService)
{
_dataService=dataService;
Foos=_dataService.GetFoos();
}
}

当我打电话时解决我的 MainViewModel
SimpleIoc.Default.GetInstance<MainViewModel>()

内部发生的是 SimpleIoc 检查 MainViewModel 是否有任何依赖项(其构造函数中的参数)。然后它尝试通过查看已注册的接口(interface)来解析这些参数。它以递归方式执行此操作,因此如果 DataService 具有依赖关系,它将被实例化并在实例化时传递给 DataService 构造函数。

我为什么要做所有这些工作?
  • 使您的类(class)易于单元测试
  • 使您的代码接口(interface)驱动。这意味着您引用的是接口(interface)而不是具体的类
  • 使您的代码松散耦合。这意味着某人可以更改接口(interface)的实现,而使用该接口(interface)的类不需要重新编码。
  • 以自动方式解决您的类依赖关系。
  • 在 MVVM Light 中,您会看到它可以判断何时在设计模式 (ViewModelBase.IsInDesignModeStatic) 下运行,这意味着您可以创 build 计时服务来提供 View 模型数据,以便 Visual Studio 中的 View 包含实际数据。
  • 关于xaml - ViewModelLocator MVVM Light 中的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14130327/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com