2016-03-01 15 views
0

我们有一个实体框架模型,其中包含名为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属性将包含_quoteStatuses集合或_systemStatuses集合。

我们通过创建一个基本状态类并让QuoteStatus和SystemStatus类从它继承来完成此操作。那很好。

我们遇到了儿童收藏问题。我们希望Status基类具有一个StatusNotifications集合,它将成为QuoteStatusNotification类或SystemStatusNotification类的集合。我们无法确定如何创建StatusNotifications集合。

another thread here(请参阅接受的答案中的第二个建议),看起来我可能可以用协方差做到这一点,但是我不知道该怎么做。

任何人都可以解释这一点?

+0

为什么相同的技术不适用于通知类?创建一个BaseNotification类,使QuoteStatusNotification和SystemStatusNotification继承并使基类的属性使用List 。 – Kevin

回答

2

简单的继承:

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。在这里看到: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> 

多一点细节,也许能帮助更多一点。

+0

我们已经按照您的建议尝试了简单继承,但是在设置Statuses集合时遇到了问题,因为它给出了投射错误。然而,你的代码让我意识到我们正在努力变得太聪明!现在所有工作,thx –

+0

P.S.感谢关于XAML绑定的提示。不是我们在这种情况下想要的,而是对未来非常有用的提示! –

0

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

List<StatusBaseClass> statuses; 

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

如果它是一个混合列表,那么你可以得到个别类型的方式:

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

对不起,读你回复,我意识到我没有正确解释问题。如你所说,这不是Statuses属性的问题,可以用基类完成。问题是如何将StatusNotifications集合添加到Status类。请参阅mu编辑的问题。 –

相关问题