代码之家  ›  专栏  ›  技术社区  ›  Alfie JP Alioto

如何在MVVM中使用同一个视图模型拥有多个视图?

  •  4
  • Alfie JP Alioto  · 技术社区  · 7 年前

    我对wpf和mvvm都是新手,在尝试设置 DataContext 在两个单独的视图中使用同一个视图模型实例。

    这是因为:

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

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

    为了解决这个问题,我决定创建一个类来存储我使用的每个视图模型的静态实例。然后在 cs 然后我将设置的每个视图的文件 数据上下文 从这个静态类到适当的ViewModel。

    这是可行的,但对于更大的程序来说似乎不是最好的主意,因为在这些程序中,可能同时需要ViewModel的多个实例。

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

    或者这种方法是不好的实践——我应该为每个视图模型设计一个具有一个视图的程序吗?

    谢谢!

    3 回复  |  直到 7 年前
        1
  •  5
  •   Fabulous    7 年前

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

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

    然后,在您的视图中,当您想要使用该数据上下文时,请执行以下操作…

    DataContext="{StaticResource sharedViewModel}"
    
        2
  •  1
  •   WPFUser    7 年前

    简单易用的方法之一就是实现ViewModelLocator。

    IDEA已经定义了ViewModelLocator类中的所有ViewModel,并在需要时访问ViewModel。在不同的视图中使用相同的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 从那里复制的代码..因为我不能从我的项目中撕掉代码。

        3
  •  0
  •   user2481095    6 年前

    我有同样的问题,找不到一个好答案。经过一段时间的思考,我得出结论,在大多数情况下,最好在视图模型和视图之间创建一对一的映射。因此,在这种情况下,我将创建两个独立的视图模型,它们继承自一个基础视图模型。这样,您就可以将基础视图模型中常见的内容放入其中,并添加可能与更具体的视图模型不同的任何字段或方法。如果视图模型确实是等效的,那么您可能会问自己为什么首先有两个独立的视图。您可以考虑将它们合并到一个视图中。有两种不同的观点是可能的,但这只是一件需要考虑的事情。