我一直在构建WPF应用程序。到目前为止,大多数ViewModel都严格遵守自己的代码。
我最近决定创建一个基类“ApplicationViewModel
”将公共代码迁移到其中。对于大多数情况来说这很好用,但我遇到了一个我遇到困难的问题。
我的继承视图模型似乎正在产生这个基本视图模型的自己的实例。结果是;如果ClassA中的方法更改了基类中的变量,那么ClassB仍然将相同的变量注册为null,或者它之前的值是什么。
最初我认为在微软的Unity容器中注册实例可以解决这个问题,
public App()
{
Container.RegisterType<ApplicationViewModel>(new ContainerControlledLifetimeManager());
}
但是没有改变。
我在研究后发现的明显答案是将课程变为静态,但在我走这条路之前,我宁愿选择其他方案。我的程序功能太多可能需要重新加工。
我不确定单例实例属性是否甚至可以使用基类声明。
所以我想我的问题是:我如何确保在我的所有ViewModel中使用这个viewmodel基类的相同实例?
答案 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;
}
}
我希望这适合你。