2016-03-01 16 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編輯的問題。 –

相關問題