2012-02-20 47 views
0

我嘗試將我的C#WPF應用程序從「非MVVM」移植到MVVM,但我正在努力繼承類。Model/ViewModel設計中的類繼承錯誤

我已經建立在我的模型的一些層次:

銀行包含的補丁的集合,其IsSelected爲界,銀行列表視圖。

public abstract class Bank: ObservableCollectionEx<Patch> 
{ 
    ... 
    bool _isSelected; 
    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set { if (value != _isSelected) { _isSelected = value; OnPropertyChanged(new PropertyChangedEventArgs("IsSelected")); } } 
    } 
    ... 

補丁定義如下。唯一有趣的類(對於這個問題)是ObservableObject。

public abstract class Patch : ObservableObject, IComparable<Patch>, INavigation, IParameter 
{ 
... 

的ObservableCollection被定義爲:

public class ObservableCollectionEx<T> : ObservableCollection<T> where T : ObservableObject 
{ 

ObservableObject被定義爲:

public abstract class ObservableObject : INotifyPropertyChanged 
{ 
... 

在我的ViewModel我需要選擇銀行的名單,所以我將它們定義:

public ObservableCollectionEx<Bank> Banks 
{ 
    get ... 

H但是,這給出了一個錯誤:

類型'PcgTools.Synths.Common.Synth.Bank'不能用作泛型類型或方法'ObservableCollectionEx'中的類型參數'T'。沒有從'PcgTools.Synths.Common.Synth.Bank'到'ObservableObject'的隱式引用轉換。 G:\ DATA \徵\ Informatica的\ KorgKronosTools \ KorgKronosTools \的ViewModels \ PcgViewModel.cs 152個45 PcgTools

我(認爲)我需要這種結構是因爲:

銀行的IsSelected屬性綁定到(銀行)listview(顯示所有銀行)。可以選擇多個銀行。所以銀行應該支持INotifyPropertyChange(ObservableObject這樣做)。

  • Patch的IsSelected屬性綁定到另一個listview(同一個窗口中的修補程序列表視圖)。補丁也可以(多選)。
  • 第一個選定的銀行補丁顯示在補丁列表視圖中。
  • 當第一個選定的銀行更改時,我應該補充補丁列表視圖,所以我需要Bank類具有ObservableCollection(Ex)支持。
  • 補丁只需要支持INotifyPropertyChange(ObservableObject)。
  • 我寧願使用ObservableObject而不是INotifyPropertyChanged,因爲它提供了一些不錯的額外方法(用於驗證)。

回答

3

我的第一個問題是你爲什麼要這樣做?但是,如果你真的需要,那麼它聽起來好像你的通用的限制,唯一的要求是,該類型實現INotifyPropertyChanged

public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged 

你並不需要在Bank類型實現INotifyPropertyChanged因爲它是由實施ObservableCollection<T>

您可能會更好地創建自己的接口(它繼承自INotifyPropertyChanged)並且具有您需要訪問的方法。然後使用該自定義接口作爲泛型類型的約束,並在ObservableObjectObservableCollectionEx中實現它。

+0

是的,我可以這樣做,結果是我不能在ObservableObject中使用派生函數。我試圖在我的問題中更好地解釋爲什麼我需要這個。 – 2012-02-21 00:01:07

+0

你是說ObservableCollection本身已經有INotifyPropertyChanged了? ....對不起愚蠢的問題(這意味着我可以自己找到它)...答案是肯定的。 – 2012-02-21 00:09:25

+1

Bank類型中需要ObservableObject的哪些方法?你可能會更好地創建自己的接口(它繼承自INotifyPropertyChanged)並具有您需要訪問的方法。然後使用該自定義接口作爲泛型類型的約束,並在ObservableObject和ObservableCollectionEx中實現它。或者測試其在ObservableCollectionEx中的存在(如果(typeof(T)是IMyInterface),並刪除通用約束使其成爲可選項 – devdigital 2012-02-21 00:14:30