我嘗試將我的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,因爲它提供了一些不錯的額外方法(用於驗證)。
是的,我可以這樣做,結果是我不能在ObservableObject中使用派生函數。我試圖在我的問題中更好地解釋爲什麼我需要這個。 – 2012-02-21 00:01:07
你是說ObservableCollection本身已經有INotifyPropertyChanged了? ....對不起愚蠢的問題(這意味着我可以自己找到它)...答案是肯定的。 – 2012-02-21 00:09:25
Bank類型中需要ObservableObject的哪些方法?你可能會更好地創建自己的接口(它繼承自INotifyPropertyChanged)並具有您需要訪問的方法。然後使用該自定義接口作爲泛型類型的約束,並在ObservableObject和ObservableCollectionEx中實現它。或者測試其在ObservableCollectionEx中的存在(如果(typeof(T)是IMyInterface),並刪除通用約束使其成爲可選項 – devdigital 2012-02-21 00:14:30