如何在 WPF中的多个窗口中使用一个视图模型?我需要仅从一个窗口更新模型并在其他窗口中处理这些更改(例如,属性'已锁定')。
我有一个视图模型包含了最常用的信息,这些信息不仅应该用在A(假设它是'Company')窗口上,还应该用在windows子窗口B上(假设它是'Person')。因此,“常规”视图模型应由A实体确定,但应传递给所有子实体。在A窗口上更新此视图模型时 - 我们应该在所有B窗口上进行更改。
public partial class A : WindowBase
{
private GeneralViewModel general;
public GeneralViewModel General
{
get
{
return this.general ?? (this.general = new GeneralViewModel ());
}
}
}
public partial class B : WindowBase
{
private GeneralViewModel general;
public GeneralViewModel General
{
get
{
return this.general ?? (this.general = new GeneralViewModel ());
}
}
public B(GeneralViewModel g)
{
this.general = g;
}
}
我希望模型只能在A中更新,而B只是显示更改是佣人。如果我传递模型,因为它在此代码中显示,或者如果我将'General'实现为具有getter的属性,则不会应用setter更改。
感谢您的帮助。
答案 0 :(得分:1)
您可以使用singleton-class作为ViewModel。
示例:
public Window()
{
this.DataContext = ViewModel.Instance.
}
编辑:
public GeneralViewModel
{
public DataType Model
{
get { return DataType.Instance; }
}
}
现在,每当您在其中一个GeneralViewModel中访问模型时,它都会被其他所有模型锁定。
答案 1 :(得分:0)
在某个静态成员中初始化您的视图模型,并让窗口将值返回为GeneralViewModel
。
答案 2 :(得分:0)
在您提到的方案中,GeneralViewModel
对Dependency
个类Window
类似IoC containers
,出于这些目的,您可以使用一些可用的MEF
或.Net 4
内置了Dependencies
。您可以在某些应用程序启动事件中注册GeneralViewModel
,包括GeneralViewModel
。
下面是一些示例代码,它将使您的[Export(typeof(B))]
public partial class B : WindowBase
{
private GeneralViewModel general;
public GeneralViewModel General
{
get
{
return this.general ?? (this.general = new GeneralViewModel ());
}
}
[ImportingConstructor]
public B(GeneralViewModel g)
{
this.general = g;
}
}
实例位于其注册的容器中(以下情况下为MEF):
MEF
要详细了解{{1}},请参阅以下文章:
还有许多其他DI和IoC容器可用作开源下载。
答案 3 :(得分:0)
使用MVVM没有问题。在这种情况下,您的ViewModel将对应于一些基本上是UserControl的View,您可以根据需要将其放置到任意数量的Windows。 当您实现MVVM时,您还应该使用INotifyPropertyChanged或ObservableCollections