关于C#:模型/视图模型设计中的类继承错误

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,因为它提供了一些不错的额外方法(用于验证)。

我的第一个问题是你为什么要这样做?但是,如果确实需要,那么听起来好像对通用约束的唯一要求是该类型实现INotifyPropertyChanged

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

您不需要在Bank类型上实现INotifyPropertyChanged,因为它是由ObservableCollection<T>

实现的

创建自己的接口(继承自INotifyPropertyChanged)并具有需要访问的方法可能会更好。然后使用该自定义接口作为通用类型的约束,并在ObservableObjectObservableCollectionEx中实现它。