Class inheritance error in Model / ViewModel design
我试图将C#WPF应用程序从非MVVM"移植"到MVVM,但是我在类的继承方面苦苦挣扎。
我已经在模型中建立了一些层次结构:
银行包含补丁程序集合,其IsSelected绑定到银行列表视图。
1 2 3 4 5 6 7 8 9 10 | 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。
1 2 3 | public abstract class Patch : ObservableObject, IComparable<Patch>, INavigation, IParameter { ... |
ObservableCollection定义为:
1 2 | public class ObservableCollectionEx< T > : ObservableCollection< T > where T : ObservableObject { |
ObservableObject定义为:
1 2 3 | public abstract class ObservableObject : INotifyPropertyChanged { ... |
在我的ViewModel中,我需要一个选定库的列表,因此我已经定义了它们:
1 2 3 | public ObservableCollectionEx<Bank> Banks { get ... |
但是这会导致错误:
在通用类型或方法" ObservableCollectionEx"中,类型" PcgTools.Synths.Common.Synth.Bank"不能用作类型参数" T"。没有从'PcgTools.Synths.Common.Synth.Bank'到'ObservableObject'的隐式引用转换。 G:\\\\ Data \\\\ Eigen \\\\ Informatica \\\\ KorgKronosTools \\\\ KorgKronosTools \\\\ ViewModels \\\\ PcgViewModel.cs 152 45 PcgTools
我(认为)我需要这种构造,因为:
"银行"的IsSelected属性绑定到(银行)列表视图(显示所有银行)。可以选择多个库。因此,银行应支持INotifyPropertyChange(ObservableObject可以做到这一点)。
- 修补程序的IsSelected属性绑定到另一个列表视图(同一窗口中的修补程序列表视图)。补丁也可以(被选择)。
- 首先选择的银行的补丁显示在补丁列表视图中。
- 当第一个选定的库被更改时,我应该重新填充补丁列表视图,因此我需要Bank类具有ObservableCollection(Ex)的支持。
- 修补程序仅需要支持INotifyPropertyChange(ObservableObject)。
- 我宁愿使用ObservableObject而不是INotifyPropertyChanged,因为它提供了一些不错的额外方法(用于验证)。
我的第一个问题是你为什么要这样做?但是,如果确实需要,那么听起来好像对通用约束的唯一要求是该类型实现
1 | public class ObservableCollectionEx< T > : ObservableCollection< T > where T : INotifyPropertyChanged |
您不需要在
实现的
创建自己的接口(继承自