繁体   English   中英

初始化视图模型,该视图模型从基础模型继承并具有基础模型的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM