Model/ViewModel设计中的类继承错误

本文关键字:继承 错误 ViewModel Model | 更新日期: 2023-09-27 18:25:25

我正在尝试将我的C#WPF应用程序从非MVVM"移植"到MVVM,但我很难继承类。

我在我的模型中建立了一些层次结构:

银行包含一组补丁,其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 ...

然而,这会产生一个错误:

类型"PcgTools。Synths。常见的Synth。Bank"不能用作泛型类型或方法"ObservableCollectionEx"中的类型参数"T"。没有来自"PcgTools"的隐式引用转换。Synths。常见的Synth。Bank"到"ObservableObject"。G: ''Data''Eigen''Informatica''KorgKronosTools''KorgKroosTools''ViewModels''PcgViewModel.cs 152 45 PcgTools

我(认为)我需要这种结构,因为:

Bank的IsSelected属性绑定到(银行)列表视图(显示所有银行)。可以选择多个银行。所以银行应该支持INotifyPropertyChange(ObservableObject就是这样做的)。

  • Patch的IsSelected属性绑定到另一个列表视图(同一窗口中的Patch列表视图)。补丁也可以(多次选择)
  • 第一个选定银行的补丁显示在补丁列表视图中
  • 当第一个选择的银行被更改时,我应该重新填充补丁列表视图,所以我需要银行类支持ObservableCollection(Ex)
  • 修补程序只需要支持INotifyPropertyChange(ObservableObject)
  • 我宁愿使用ObservableObject而不是INotifyPropertyChanged,因为它提供了一些不错的额外方法(用于验证)

Model/ViewModel设计中的类继承错误

我的第一个问题是你为什么要这么做?但是,如果您确实需要,那么对泛型约束的唯一要求似乎是该类型实现INotifyPropertyChanged:

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

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

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