2013-02-15 149 views
0

我正在編寫一個WPF應用程序,我目前正在將一些重用代碼重構爲其他視圖模型可以繼承的基本ViewModel類。在此基礎上類從基類演變爲可繼承類繼承類

一個屬性字段是

public class MessageParentBase 
{ 
    MessageParentBase() {} 

    public string Name; 
} 

internal ObservableCollection<MessageParentBase> _GridData = new ObservableCollection<MessageParentBase>(); 

我有一個後續的財產申報

public ObservableCollection<MessageParentBase> GridData 
    { 
     get { return _GridData; } 
     set { _GridData = value; } 
    } 

這個偉大的工程,一切我的問題是,inerited類實際使用的後續類

Public class ChatMessage : MessageParentBase 
{ 
    public string Message; 
} 

並且該視圖包含一個數據網格,它是博und到這個GridData屬性,但是應該從ChatMessage類中綁定到Message字段的列是空的,並且填充MessageParentBase類中的字段。

所以我認爲有一個問題,不知道從MessageParentBase類轉換到ChatMessage。

我可以通知視圖,對象將是「ChatMessage」類型。

我也嘗試了移動的財產申報到繼承的視圖模型作爲

public ObservableCollection<ChatMessage> GridData 
    { 
     get { return _GridData; } 
     set { _GridData = value; } 
    } 

,但是這給了我以下錯誤: -

無法隱式轉換類型「System.Collections.ObjectModel.ObservableCollection」到'System.Collections.ObjectModel.ObservableCollection'

我是否需要在視圖級別進行強制轉換,或者是否可以更改視圖模型以更好地實現此目標?

任何建議將不勝感激。

埃姆林

+0

*您在視圖級*上強制轉換的含義是什麼?您是否綁定了基本視圖模型並想要顯示ChatMessage屬性?你的問題不清楚。向我們展示您將視圖模型綁定到視圖的方式。 – Joao 2013-02-15 17:43:55

+0

另外,顯示messageParentBase類。就目前而言,你的問題很難遵循。 – 2013-02-15 17:45:09

+0

希望我的編輯可以幫助更多地解釋我的問題。 – Emlyn 2013-02-15 18:09:24

回答

0

更改收集到這樣的:

public ObservableCollection<MessageParentBase> GridData { get; set; } 

然後添加到您的構造

this.GridData = new ObservableCollection<MessageParentBase>(); 

由於WPF使用反射來從數據上下文檢索綁定的數據應能獲取存儲在該集合中的派生類的值。

此外,當您運行您的應用程序檢查輸出窗口與調試選中,XAML引擎將輸出任何綁定錯誤。

+0

我試過這種方法,但GridData被聲明爲 ObservableCollection () 它仍然不顯示派生類中的字段。 – Emlyn 2013-02-15 20:54:55

0

您的ViewModel應該包含一個列表,其中您的網格將顯示的類型(在本例中爲ChatMessage類型)。您仍然可以使用繼承來調用常用方法,但綁定列表必須是ChatMessage類型

+0

啊,我在想這是事實。有沒有辦法在基類中有一些參考,因爲我希望移動到這個類的許多功能並沒有尋找特定的ChatMessage類和這個可觀察的集合。否則,我會爲每個使用MessageParentBase中不同派生類的viewmodel重複使用很多代碼。 – Emlyn 2013-02-15 18:51:45

+0

當您得到選定的項目時,將返回的對象將具有ChatMessage類型。由於這個類繼承自MessageParentBase,所以你可以正常訪問它的所有方法(我認爲這是你的疑問) – 2013-02-15 19:50:38

+0

我真正的問題是如何去除需要引用GridData可觀察集合的重複代碼(但是僅僅是對MessageParentBase類字段感興趣)在ViewModel的基類中,同時仍然能夠將可觀察集合作爲ChatMessage啓動。 我想我可以在基本視圖模型中聲明該字段,然後在派生的ViewModel中聲明該屬性,但我被告知我不能將一個ObservableCollection從一個ObservableCollection轉換爲另一個,即使一個類從另一個繼承。 – Emlyn 2013-02-15 21:00:29