0

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

我有一个视图模型,其中包含最通用的信息,不仅应该在 A(假设它是“公司”)窗口上使用,而且还应该在 Windows 子窗口 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 更改的属性,则不会应用。

谢谢你的帮助。

4

4 回答 4

1

您可以使用单例类作为您的 ViewModel。

例子:

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

编辑:

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

现在,每次您在一个 GeneralViewModel 中访问模型时,它都会为所有其他模型锁定。

于 2013-09-23T10:13:19.160 回答
0

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

于 2013-09-25T12:53:46.030 回答
0

在某处的静态成员中初始化您的视图模型,并让窗口将值作为GeneralViewModel.

于 2013-09-23T09:57:07.507 回答
0

在您提到的场景中,您GeneralViewModel的类对Dependency您的Window类都是一种,出于这些目的,您可以使用一些可用的IoC containersMEF内置的.Net 4. 您可以在某些应用程序启动事件中注册您的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 容器可作为开源下载。

于 2013-09-23T10:13:05.150 回答