2013-09-23 48 views
0

如何使用一个视图模型对于许多窗口在WPF?我需要从一个窗口更新模型,并在其他人处理这些更改(例如,“锁定”属性)。在多个窗口中使用一个视图模型

我有一个视图模型,它不仅包含A(假设它是'Company')窗口,还包含窗口子窗口B(假设它是'Person')应该使用的最一般信息。所以'一般'视图模型应该由一个实体来确定,但是要传递给所有的儿童实体。在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实现'General'作为属性,并且setter更改未应用。

感谢您的任何帮助。

回答

0

在静态成员的某个位置初始化您的视图模型,并让窗口返回值为GeneralViewModel

+0

我应该可以有一个窗口的多个实例。所以一个实例可以被锁定,另一个不可以。子窗口引用具体的A实体并且也被锁定或不锁定。 我不明白静态成员如何帮助我。 – Julia

+0

@Julia鉴于你已经很好地封装了你的视图模型属性,你将不得不改变你的窗口代码。静态属性应该返回你的视图模型,窗户应该像往常一样实例化。 – Gusdor

0

在你提到的情况,你的GeneralViewModel是一种Dependency到这两个Window类,并为这些目的,你可以使用一些内置.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,看到这些文章:

有可用的开放源码下载许多其他DI和IoC容器。

+0

我不应该添加其他东西吗?现在更改也不反映在视图上。 看起来我需要在赋值后为所有属性调用'RaisePropertyChanged'。 – Julia

1

您可以使用singleton-class作为您的ViewModel。

例子:

public Window() 
{ 
    this.DataContext = ViewModel.Instance. 
} 

编辑:

public GeneralViewModel 
{ 
    public DataType Model 
    { 
     get { return DataType.Instance; } 
    } 
} 

现在每次你访问该模型在GeneralViewModels之一,它已被锁定为所有其他人。

+0

对不起,但我应该可以创建多个Windows eigher。这样每个A都有自己的GeneralViewModel。 (假设A是公司,B是人,如果A被锁定,B也锁定)。 – Julia

+0

比只做一个单身人士的模特。看看我的编辑。 –

0

如果您使用MVVM,则没有问题。在这种情况下,您的ViewModel将对应于一些基本上是UserControl的View,并且您可以将它放置到任意多个Windows中。 而当你实现MVVM时,你也应该使用INotifyPropertyChanged或ObservableCollections

相关问题