在多个窗口中使用一个视图模型
本文关键字:一个 视图 模型 窗口 | 更新日期: 2023-09-27 18:32:27
如何在 WPF 中对多个窗口使用一个视图模型?我只需要从一个窗口更新模型,并在其他窗口中处理这些更改(例如属性"锁定")。
我有一个视图模型封装了最一般的信息,这些信息不仅应该在 A(假设它是"公司")窗口上使用,还应该在窗口子窗口 B(假设它是"人")上使用。因此,"常规"视图模型应由 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 只是显示更改是女仆。如果我传递此代码中显示的模型,或者如果我将"常规"实现为属性,则不会应用getter和setter更改。
感谢您的任何帮助。
您可以使用单例类作为 ViewModel。
例:
public Window()
{
this.DataContext = ViewModel.Instance.
}
编辑:
public GeneralViewModel
{
public DataType Model
{
get { return DataType.Instance; }
}
}
现在,每次您在其中一个 GeneralViewModel 中访问该模型时,所有其他模型都会被锁定。
某处的静态成员中初始化视图模型,并让窗口返回值作为其GeneralViewModel
。
在您提到的场景中,您的GeneralViewModel
是对Window
类的一种Dependency
,出于这些目的,您可以使用一些内置于 .Net 4
中的可用IoC containers
或MEF
。您可以在某些应用程序启动事件中注册Dependencies
包括GeneralViewModel
。
下面是一些示例代码,这些代码将使GeneralViewModel
实例随后从注册到的容器中定位(在下面的例子中为 MEF):
[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) 简介 - 第一部分
还有许多其他 DI 和 IoC 容器可作为开源下载。
如果使用 MVVM,则没有问题。在这种情况下,您的视图模型将对应于某个视图,该视图基本上是用户控件,您可以根据需要将其放置在任意数量的Windows上。当你实现MVVM时,你还应该使用INotifyPropertyChanged或ObservableCollections