在多个窗口中使用一个视图模型

本文关键字:一个 视图 模型 窗口 | 更新日期: 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 containersMEF。您可以在某些应用程序启动事件中注册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