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

时间:2012-02-20 23:45:41

标签: c# wpf inheritance mvvm

我试图将我的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.Common.Synth.Bank'不能在泛型类型或方法'ObservableCollectionEx'中用作类型参数'T'。没有从'PcgTools.Synths.Common.Synth.Bank'到'ObservableObject'的隐式引用转换。 G:\ Data \ Eigen \ Informatica \ KorgKronosTools \ KorgKronosTools \ ViewModels \ PcgViewModel.cs 152 45 PcgTools

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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