为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
肥皂起泡泡 2021-10-31 19:15:53
我是 WPF 和 MVVM 的新手,并且在尝试DataContext在两个单独的视图中将其设置为我的 ViewModel 的同一实例时遇到了一个问题。这是因为:<Window.DataContext>     <local:ViewModel/>     </Window.DataContext>将为每个视图创建一个新的视图模型实例。为了解决这个问题,我决定创建一个类来存储我使用的每个 ViewModel 的静态实例。然后在cs每个视图的文件中,我DataContext将从这个静态类设置为适当的 ViewModel。这行得通,但对于可能同时需要多个 ViewModel 实例的大型程序来说,这似乎不是最好的主意。有什么更好的方法可以解决这个问题 - 是否有使用同一个 ViewModel 实例拥有多个视图的合理方法?或者这种方法是不好的做法 - 我应该为每个 ViewModel 设计一个具有一个视图的程序吗?
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

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


<Application.Resources>

    <local:ViewModel x:Key="sharedViewModel" />

</Application.Resources>

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


DataContext="{StaticResource sharedViewModel}"


查看完整回答
反对 回复 2021-10-31
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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


查看完整回答
反对 回复 2021-10-31
?
九州编程

TA贡献1785条经验 获得超4个赞

实现 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;

        }

    }

}

应用程序.xaml


    xmlns:core="clr-namespace:MyViewModelLocatorNamespace"


<Application.Resources>

    <core:ViewModelLocator x:Key="ViewModelLocator" />

</Application.Resources>

用法


<Window ...

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

参考:所以问题 代码从那里复制..因为我无法从我的项目中撕下代码..


查看完整回答
反对 回复 2021-10-31
  • 3 回答
  • 0 关注
  • 381 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信