C# Can';t在另一个ViewModel中使用来自MainViewModel的数据

C# Can';t在另一个ViewModel中使用来自MainViewModel的数据,c#,.net,wpf,mvvm,viewmodel,C#,.net,Wpf,Mvvm,Viewmodel,我对MVVM和两个视图以及相应的ViewModels有问题 我有一个MainViewModel和SettingsViewModel MainViewModel在程序开始从xml文件读取设置时执行。 如果单击主视图中的设置按钮,SettingsView将打开绑定的SettingsViewModel,并用数据填充表单。 但问题是如何将数据从MainViewModel获取到SettingsViewModel 在SettingViewModel中,我没有MainViewModel的参考。我怎么能得到这个

我对
MVVM
两个视图以及相应的
ViewModels
有问题

我有一个
MainViewModel
SettingsViewModel

MainViewModel
在程序开始从xml文件读取设置时执行。 如果单击主视图中的设置按钮,
SettingsView
将打开绑定的
SettingsViewModel
,并用数据填充表单。 但问题是如何将数据从
MainViewModel
获取到
SettingsViewModel

SettingViewModel
中,我没有
MainViewModel
的参考。我怎么能得到这个

我的第一个想法是在构造函数上设置数据,但我不能使用构造函数,因为我在
App.xaml
中使用
DataTemplate
获取视图的实例:

        <DataTemplate DataType="{x:Type viewmodels:SettingsViewModel}">
          <views:SettingsView/>
        </DataTemplate>

我的第二个想法是用事件来解决它。但这也不起作用,因为我没有在
MainViewModel
中获取
SettingsViewModel
的引用

这是我第一个使用
MVVM
模式的项目。也许这是我的理解问题

一个星期以来我一直在努力解决这个问题,现在我非常绝望

为了更好地理解,我在Github上创建了一个示例项目:

请帮帮我,谢谢

这是我第一个使用
MVVM
模式的项目。也许这是我的理解问题

您的MVVM分层很好

  • 型号:设置
  • 视图模型:设置视图模型
  • 视图:设置视图
在父级
MainViewModel
上存储/使用
Settings
实例也很有意义

你的问题更多的是静态与实例的误解

SettingsView
中,您将
SettingsViewModel
定义为静态资源。这意味着每次解析
设置视图时都会调用其默认构造函数


...
如果您在
SettingsViewModel
构造函数中创建了一个新的
Settings
实例,那么您将永远得到一张白板

public SettingsViewModel()
{
Mysettings=新设置();
...
}
最好在每次请求时将
Settings
实例从
MainViewModel
传递到
SettingsViewModel

ActualPage=新设置查看模型(mysettings);
使用依赖项注入更新的构造函数

公共设置查看模型(设置)
{
Mysettings=设置;
...
}
不是
DataTemplate
流抱怨构造函数,它只是匹配类型。然而,静态资源确实需要一个无参数构造函数,但是我们同样不需要/不想要那个功能。更新
设置视图后
一切应按预期工作



注意,我们让
DataContext
隐式流动,这(通常)是良好设计的标志。

您可以将setingsviewmodel设置为MainViewModel的属性。如果MainViewModel从文件中读取设置,它可以直接将其保存到其属性SettingsViewModel,这是SettingsView的数据上下文。谢谢。我已经试过了。问题是,我使用ContentControl元素更改视图(usercontrols)。如果我更改ContentControl上的视图,则将创建viewmodel的新实例,而我没有获得此引用。不应更改viewmodel,它应始终是同一实例。如果SettingsView是MainView中的一个元素,则可以使用
(假设属性名为
SettingsView`)将SettingsView模型绑定到SettingsView,以始终使用SettingsView模型的正确实例。我正在使用带有绑定的ContentControl元素来更改mainViewModel中的视图。我在问题中添加了一个示例项目,您可以在那里看到它。选项1:将设置viewmodel作为mainviewmodel中的属性,并相应地调用它。选项2:创建一个单例类来保存数据。选项3:设置一个IOC容器(可能是过度终止),并注册mainviewmodel和settingsviewmodel。没有任何问题地解决它们。非常感谢。现在一切正常。