[英]Initialise View Model that inherits from base model with values from base model
我有一个返回Class1Model
的函数
Class1Model model = GetClass1Model();
我也有一个Class1ViewModel
,它继承自Class1Model
,我在其中添加了一些仅获取属性以在视图中进行格式化。
public class Class1ViewModel : Class1Model
{
public string MyFormattedProperty => $"{base.Height:###.00} x {base.Width:###.00}"
}
所以我希望我能做到这一点:
Class1Model model = GetClass1Model();
var viewModel = model as Class1ViewModel;
但这行不通
那么通常如何做呢?
我建议使用合成方法而不是继承。
class Class1Model
{
// model properties
}
class Class1ViewModel
{
public Class1ViewModel(Class1Model model)
{
_Model = model;
}
private Class1Model _Model;
public Class1Model Model { get { return _Model; } }
// viewmodel specific extensions
public string MyFormattedProperty => $"{Model.Height:###.00} x {Model.Width:###.00}"
}
如果您希望模型属性发生更改,则应该使用一些弱事件侦听器订阅模型属性更改,并为从属viewmodel属性发出适当的属性更改事件。
您正在尝试将基本类型的实例转换为不允许的子类型。
Class1ViewModel是Class1Model。 并非相反。
所以这可以工作:
Class1ViewModel viewModel = new Class1ViewModel();
Class1Model model = viewModel;
通常,这没有任何意义(请阅读此答案 ),因此我不确定提供通用解决方案是否是一个好主意。
您肯定可以拥有一个,例如通过序列化技巧进行克隆:
using Newtonsoft.Json;
class Base
{
public string A;
public string B;
}
class Inherited : Base
{
public string C = "c";
}
// in some method
var @base = new Base { A = "a", B = "b" };
var inherited = JsonConvert.DeserializeObject<Inherited>(JsonConvert.SerializeObject(@base));
inherited
将复制@base
值(我使用过的字段,也应该适用于属性),并且自己的值将是默认值。
这是非常缓慢的方法。 考虑改为使用手动复印:
var @base = new Base { A = "a", B = "b" };
var inherited = new Inherited { A = @base.A, B = @base.B, C = "whatever" };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.