视图模型继承

本文关键字:继承 模型 视图 | 更新日期: 2023-09-27 17:57:07

我想根据所选选项加载带有ViewModel的屏幕。

我认为继承将是这里的关键,因为很多属性都是相同的。以下是我拥有的代码摘录。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        bool isHandheld = false;
        var pdv1 = isHandheld == true ? new PDVHH() : new PDV();
        txtCaseID.Text = pdv1.CaseID;
        txtPDV.Text = isHandheld == true ? pdv1.PDVString : string.Empty;
        txtPDVHH.Text = isHandheld == true ? pdv1.PDVHHString : string.Empty;
    }
}
class basePDV
{
    public string CaseID { get; set; }
}
class PDV : basePDV
{
    public string PDVString { get; set; }
}
class PDVHH : basePDV
{
    public string PDVHHString { get; set; }
}

我收到的错误是..."无法确定条件表达式的类型,因为'WindowsFormsApplication1.PDVHH'和'WindowsFormsApplication1.PDV'之间没有隐式转换"

我希望有人能给我一些解决方案的指导。

视图模型继承

好的,你的问题不是关于继承或 ViewModels,而是关于?:(条件运算符)如何工作。

以下内容将修复它:

var pdv1 = isHandheld == true ? (basePDV) new PDVHH() : (basePDV) new PDV();

虽然你的代码看起来很有道理,但文档说你需要在 PDVHH 和 PDV 之间进行转换,无论哪个方向,但不考虑转换为 basePDV。

当您可以找到 PDVString 和 PDVHHString 的通用名称并将其实现为基类中的单个属性时,它可能会像您想要的那样工作。甚至更简单。请注意,class PDV : basePDV {}正常。

C# 语言规范区分了三种类型的语句。通常,您可以有以下语句:

标记语句 - 这是首选语句

声明语句 - 这适用于变量声明

嵌入式语句 - 适用于所有剩余语句

在 if 语句中,主体必须嵌入语句,这解释了为什么代码的第一个版本不起作用。

if (布尔表达式) 嵌入语句如果(布尔表达式)嵌入语句其他嵌入语句

变量声明是声明语句,因此它不能出现在正文中。如果将声明括在括号中,则会得到一个语句块,这是一个嵌入语句(因此它可以出现在该位置)。

var pdv1 = isHandheld == true ? new PDVHH() : new PDV(); is considered a declaration-statement.
//var pdv1 = isHandheld == true ? new PDVHH() : new PDV(); won't work but the following will
// The above is the equivalent of the below statement which will NOT work.
if (isHandheld)
      var pdv1 = new PDVHH();
else
      var pdv1 = new PDV();
if (isHandheld)
{
    var pdv1 = new PDVHH();
}
else
{
    var pdv1 = new PDV();
}