如何提供通用子属性

本文关键字:属性 何提供 | 更新日期: 2023-09-27 18:36:51

我们有一个实体框架模型,其中包含名为 QuoteStatus 和 SystemStatus 的类,它们分别对报价和系统的状态进行建模。其中每个类都有一个导航属性,该属性是一个集合,其中包含在状态更改时要通知的人员的电子邮件。QuoteStatus 类看起来像这样(简化)...

public class QuoteStatus {
  public int ID { get; set; }
  public string Name { get; set; }
  public List<QuoteStatusNotification> QuoteStatusNotifications;
}
public class QuoteStatusNotification {
  public int ID { get; set; }
  public string Email { get; set; }
}

SystemStatus 和 SystemStatusNotification 类非常相似。

现在,我们希望有一个可用于维护这两种类型的状态(以及将来出现的任何其他状态)的 WPF 窗口。这个想法是在窗口顶部有一个下拉控件,用户在其中指定要显示的状态类型(报价或系统),并将值发送到视图模型。

视图模型将具有数据的私有变量...

private List<QuoteStatus> _quoteStatuses;
private List<SystemStatus> _systemStatuses;

我们希望视图模型具有公共 Statuses 属性,该属性可以绑定到视图上的网格。根据用户在下拉列表中选择的值,Statuses 属性将包含_quoteStatuses集合或_systemStatuses集合。

我们通过创建一个基 Status 类,并让 QuoteStatus 和 SystemStatus 类继承自它来实现这一点。那很好。

我们在子集合方面遇到了问题。我们希望 Status 基类具有 StatusNotifications 集合,该集合将是 QuoteStatusNotification 类或 SystemStatusNotification 类的集合。我们无法弄清楚如何创建该状态通知集合。

从这里的另一个线程(请参阅接受答案中的第二个建议),看起来我可以通过协方差来做到这一点,但我无法弄清楚如何做到这一点。

有人能解释这一点吗?

如何提供通用子属性

简单继承:

public class StatusBaseClass
{
    public List<StatusNotification> StatusNotifications;
}
public class QuoteStatus : StatusBaseClass
{
}
public class SystemStatus : StatusBaseClass
{
}
public class StatusNotification
{
}
public class QuoteStatusNotification : StatusNotification
{
}
public class SystemtatusNotification : StatusNotification
{
}

可以将 QuoteStatusNotificatio 或 SystemStatusNotification 添加到基类列表中

例如,在 xaml 中可以真正整洁地执行的操作是为列表视图中的两个类提供不同的 UI。 请参阅此处:网格视图列单元格模板中每个数据类型的数据模板

例如:

<ListView ItemsSource="{Binding Statuses}">
    <ListView.Resources>
        <DataTemplate DataType="{x:Type viewModel:SystemStatus}">
        </DataTemplate>
        <DataTemplate DataType="{x:Type viewModel:QuoteStatus}">
        </DataTemplate>
    </ListView.Resources>
</ListView>

详细地了解您正在尝试做的事情,也许可以提供更多帮助。

创建一个基类,该基类具有两种类型中通用的属性。然后你可以通过

List<StatusBaseClass> statuses;

您可以将任一类型放入此列表中。

如果是混合列表,则可以通过以下方式获取单个类型:

var quoteStatuses = statuses.OfType<QuoteStatus>();
var systemStatuses = statuses.OfType<SystemStatus>();