我如何提供通用 child 属性
How do I provide a generic child property
我们有一个 Entity framework 模型,其中包含名为 QuoteStatus 和 SystemStatus 的 classes,它们分别对报价和系统的状态建模。这些 classes 中的每一个都有一个导航 属性,它是一个集合,其中包含状态更改时要收到通知的人员的电子邮件。 QuoteStatus class 看起来像这样(简化)...
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 class非常相似。
现在,我们想要一个 WPF window 可用于维护这两种类型的状态(以及将来出现的更多状态)。这个想法是在 window 的顶部有一个下拉控件,用户可以在其中指定要显示的状态类型(报价或系统),并将值发送到视图模型。
视图模型将具有数据的私有变量...
private List<QuoteStatus> _quoteStatuses;
private List<SystemStatus> _systemStatuses;
我们希望视图模型有一个 public 状态 属性,它可以绑定到视图上的网格。根据用户在下拉列表中选择的值,状态 属性 将包含 _quoteStatuses 集合或 _systemStatuses 集合。
我们通过创建一个基本 Status class 并让 QuoteStatus 和 SystemStatus class 继承它来做到这一点。很好。
我们 运行 遇到了 child 集合的问题。我们希望 Status 基础 class 有一个 StatusNotifications 集合,它将是 QuoteStatusNotification class 或 SystemStatusNotification class 的集合。我们不知道如何创建 StatusNotifications 集合。
来自 (请参阅接受的答案中的第二个建议),看起来我可以用协方差来做到这一点,但我无法理解如何去做。
谁能解释一下?
创建一个基础 class,它具有两种类型共有的属性。然后就可以通过
List<StatusBaseClass> statuses;
您可以将任一类型放入此列表。
如果它是一个混合列表,那么您可以通过以下方式获取各个类型:
var quoteStatuses = statuses.OfType<QuoteStatus>();
var systemStatuses = statuses.OfType<SystemStatus>();
简单继承:
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 添加到基础 class 列表
您可以在 xaml 中真正巧妙地做的是为列表视图中的两个 class 提供不同的 UI。看这里:DataTemplate for each DataType in a GridViewColumn CellTemplate
例如:
<ListView ItemsSource="{Binding Statuses}">
<ListView.Resources>
<DataTemplate DataType="{x:Type viewModel:SystemStatus}">
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:QuoteStatus}">
</DataTemplate>
</ListView.Resources>
</ListView>
关于您正在尝试做的事情的更多细节,也许能提供更多帮助。
我们有一个 Entity framework 模型,其中包含名为 QuoteStatus 和 SystemStatus 的 classes,它们分别对报价和系统的状态建模。这些 classes 中的每一个都有一个导航 属性,它是一个集合,其中包含状态更改时要收到通知的人员的电子邮件。 QuoteStatus class 看起来像这样(简化)...
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 class非常相似。
现在,我们想要一个 WPF window 可用于维护这两种类型的状态(以及将来出现的更多状态)。这个想法是在 window 的顶部有一个下拉控件,用户可以在其中指定要显示的状态类型(报价或系统),并将值发送到视图模型。
视图模型将具有数据的私有变量...
private List<QuoteStatus> _quoteStatuses;
private List<SystemStatus> _systemStatuses;
我们希望视图模型有一个 public 状态 属性,它可以绑定到视图上的网格。根据用户在下拉列表中选择的值,状态 属性 将包含 _quoteStatuses 集合或 _systemStatuses 集合。
我们通过创建一个基本 Status class 并让 QuoteStatus 和 SystemStatus class 继承它来做到这一点。很好。
我们 运行 遇到了 child 集合的问题。我们希望 Status 基础 class 有一个 StatusNotifications 集合,它将是 QuoteStatusNotification class 或 SystemStatusNotification class 的集合。我们不知道如何创建 StatusNotifications 集合。
来自
谁能解释一下?
创建一个基础 class,它具有两种类型共有的属性。然后就可以通过
List<StatusBaseClass> statuses;
您可以将任一类型放入此列表。
如果它是一个混合列表,那么您可以通过以下方式获取各个类型:
var quoteStatuses = statuses.OfType<QuoteStatus>();
var systemStatuses = statuses.OfType<SystemStatus>();
简单继承:
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 添加到基础 class 列表
您可以在 xaml 中真正巧妙地做的是为列表视图中的两个 class 提供不同的 UI。看这里:DataTemplate for each DataType in a GridViewColumn CellTemplate
例如:
<ListView ItemsSource="{Binding Statuses}">
<ListView.Resources>
<DataTemplate DataType="{x:Type viewModel:SystemStatus}">
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:QuoteStatus}">
</DataTemplate>
</ListView.Resources>
</ListView>
关于您正在尝试做的事情的更多细节,也许能提供更多帮助。