如何在MVVM中使用相同的ViewModel拥有多个视图?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MVVM中使用相同的ViewModel拥有多个视图?相关的知识,希望对你有一定的参考价值。

我是WPF和MVVM的新手,在尝试在两个单独的视图中将DataContext设置为我的ViewModel的同一个实例时遇到了一个问题。

这是因为:

<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>

将为每个视图创建一个新的视图模型实例。

为了解决这个问题,我决定创建一个存储我使用的每个ViewModel的静态实例的类。然后在每个视图的cs文件中,我将DataContext设置为来自此静态类的相应ViewModel。

这可行,但对于可能同时需要ViewModel的多个实例的大型程序而言似乎不是最佳选择。

有什么更好的方法来解决这个问题 - 是否有合理的方法可以使用ViewModel的同一个实例来拥有多个视图?

或者这种做法是不好的做法 - 我应该为每个ViewModel设计一个带有一个View的程序吗?

谢谢!

答案

您可以在App.xaml中实例化该视图模型,以便整个应用程序可以访问它。

<Application.Resources>
    <local:ViewModel x:Key="sharedViewModel" />
</Application.Resources>

然后在您想要使用该datacontext的视图中,执行以下操作...

DataContext="{StaticResource sharedViewModel}"
另一答案

简单易用以及推荐的方法之一是实现ViewModelLocator。

Idea已经在ViewModelLocator类中定义了所有ViewModel,并在需要的地方访问ViewModel。在不同的View中使用相同的ViewModel在这里不会有问题。

    public class ViewModelLocator
{
         private MainWindowViewModel mainWindowViewModel;
  public MainWindowViewModel MainWindowViewModel
    {
        get
        {
            if (mainWindowViewModel == null)
                mainWindowViewModel = new MainWindowViewModel();

            return mainWindowViewModel;
        }
    }
    private DataFactoryViewModel dataFactoryViewModel;
 public DataFactoryViewModel DataFactoryViewModel
    {
        get
        {
            if (dataFactoryViewModel == null)
                dataFactoryViewModel = new DataFactoryViewModel();

            return dataFactoryViewModel;
        }
    }
}

App.xaml中

    xmlns:core="clr-namespace:MyViewModelLocatorNamespace"

<Application.Resources>
    <core:ViewModelLocator x:Key="ViewModelLocator" />
</Application.Resources>

用法

<Window ...
  DataContext="{Binding Path=MainWindowViewModel, Source={StaticResource ViewModelLocator}}">

参考:从那里复制的So Question代码..因为我不能从我的项目中删除代码..

另一答案

我有同样的问题,我找不到一个好的答案。在考虑了一段时间之后,我得出的结论是,在大多数情况下,最好在视图模型和视图之间创建一对一的映射。所以在这种情况下,我会创建两个从基本视图模型继承的独立视图模型。这样,您可以放置​​基本视图模型中的常见内容,并添加可能与更具体的视图模型不同的任何字段或方法。如果视图模型真的相同,那么您可能想问自己为什么首先有两个单独的视图。您可以考虑将它们合并到一个视图中。有两个单独的视图可能是你想要的,但它只是需要考虑的事情。

以上是关于如何在MVVM中使用相同的ViewModel拥有多个视图?的主要内容,如果未能解决你的问题,请参考以下文章

在 ViewModel (MVVM) 中使用视图方法

如何使用 mvvm 模式从不同的 ViewModel 获取属性和调用命令

如何使用 MVVM 和 Caliburn Micro 在多个 ViewModel 中使用模型中的数据

iOS 中使用 MVVM,复杂的 Cell 的 ViewModel 应该如何去写

如何在 viewmodel 中访问 mvvm 模型中的控件?

我应该如何在 Android 的 viewModel 中获取 Resources(R.string)(MVVM 和数据绑定)