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

时间:2013-09-23 09:54:10

标签: c# .net wpf

如何在 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更改。

感谢您的帮助。

4 个答案:

答案 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)

在您提到的方案中,GeneralViewModelDependency个类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