如何只确保View Model Base类的一个实例?

时间:2017-01-30 12:50:01

标签: c# wpf mvvm unity-container

我一直在构建WPF应用程序。到目前为止,大多数ViewModel都严格遵守自己的代码。 我最近决定创建一个基类“ApplicationViewModel”将公共代码迁移到其中。对于大多数情况来说这很好用,但我遇到了一个我遇到困难的问题。

我的继承视图模型似乎正在产生这个基本视图模型的自己的实例。结果是;如果ClassA中的方法更改了基类中的变量,那么ClassB仍然将相同的变量注册为null,或者它之前的值是什么。

最初我认为在微软的Unity容器中注册实例可以解决这个问题,

public App()
{

    Container.RegisterType<ApplicationViewModel>(new ContainerControlledLifetimeManager());
}

但是没有改变。

我在研究后发现的明显答案是将课程变为静态,但在我走这条路之前,我宁愿选择其他方案。我的程序功能太多可能需要重新加工。

我不确定单例实例属性是否甚至可以使用基类声明。

所以我想我的问题是:我如何确保在我的所有ViewModel中使用这个viewmodel基类的相同实例?

3 个答案:

答案 0 :(得分:2)

  

我如何确保在我的所有ViewModel中使用此viewmodel基类的相同实例?

不可能。基类是从中继承的类的定义的一部分,即基类和派生类是同一实例的一部分。创建dervived类的实例时,仅创建该类型的单个实例。基类型是这种类型的一部分。

如果你只想要继承的基类的单个实例不是解决方案。

相反,您可以使用每个子视图模型中的Container来获取对共享视图模型对象的引用:

public class ChildViewModel //doesn't inhert from the base view model
{
    public ChildViewModel()
    {
        var sharedViewModel = Container.Resolve<ApplicationViewModel>();
        //call any properties or methods of the sharedViewModel...
    }
}

答案 1 :(得分:0)

如果您的viewmodel确实(技术上)从基类继承,则需要继承的viewmodel的每个实例的基类实例。

您可以通过创建一个静态类(或单例实例)来解决您的问题,该类存储这些值,对于所有现有的视图模型应该相等。

您的基类仍然可以包含使用这些静态变量的非静态访问器(get- / set方法)。实际上,您的viewmodel不需要知道存储值的位置。

实际上,这非常接近于在非静态基类中定义一些static / properties static。所以也许这也是一个选择。

答案 2 :(得分:0)

很抱歉,但是无法使用基类的一个实例来获得派生类的不同实例。

我可以建议下一个设计。在基类中创建一个字段:

private static Dictionary<string, object> _hash = new Dictionary<string, object>

在派生类的基类中创建受保护的属性:

 protected string Title {
 get { 
    string value;
    ApplicationViewModel._hash.TryGetValue("Title", out value);
    return value;
  }
  set {
    ApplicationViewModel._hash["Title"] = value;
  }
}

我希望这适合你。