我试图将我的C#WPF应用程序从非MVVM“移植”到MVVM,但是我在类的继承方面苦苦挣扎。
我在模型中建立了一些层次结构:
银行包含补丁程序集合,其IsSelected绑定(bind)到银行列表 View 。
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 ...
但这给出了一个错误:
'PcgTools.Synths.Common.Synth.Bank'类型不能用作通用类型或方法'ObservableCollectionEx'中的类型参数'T'。没有从'PcgTools.Synths.Common.Synth.Bank'到'ObservableObject'的隐式引用转换。 G:\Data\Eigen\Informatica\KorgKronosTools\KorgKronosTools\ViewModels\PcgViewModel.cs 152 45 PcgTools
我(认为)我需要这种构造,因为:
Bank的IsSelected属性绑定(bind)到(银行)列表 View (显示所有银行)。可以选择多个库。因此,银行应支持INotifyPropertyChange(ObservableObject可以做到这一点)。
最佳答案
我的第一个问题是为什么要这样做?但是,如果确实需要,那么听起来通用约束的唯一要求就是该类型实现INotifyPropertyChanged
:
public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
您不需要在
INotifyPropertyChanged
类型上实现Bank
,因为它是由ObservableCollection<T>
实现的创建自己的接口(interface)(继承自
INotifyPropertyChanged
)并拥有需要访问的方法可能会更好。然后使用该自定义接口(interface)作为通用类型的约束,并在ObservableObject
和ObservableCollectionEx
中实现它。关于c# - 模型/ViewModel设计中的类继承错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9370135/