我试图将我的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这样做)。
答案 0 :(得分:3)
我的第一个问题是你为什么要这样做?但是如果你真的需要,那么听起来好像你的泛型约束的唯一要求是类型实现INotifyPropertyChanged
:
public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
您不需要在INotifyPropertyChanged
类型上实施Bank
,因为它由ObservableCollection<T>
实施
您可能更擅长创建自己的界面(继承自INotifyPropertyChanged
)并拥有您需要访问的方法。然后使用该自定义界面作为通用类型的约束,并在ObservableObject
和ObservableCollectionEx
中实现。