【发布时间】:2012-02-20 23:45:40
【问题描述】:
我正在尝试将我的 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
我(认为)我需要这种结构,因为:
Bank 的 IsSelected 属性绑定到(银行)列表视图(显示所有银行)。可以选择多个银行。所以银行应该支持 INotifyPropertyChange(ObservableObject 做到这一点)。
- Patch 的 IsSelected 属性绑定到另一个列表视图(同一窗口中的补丁列表视图)。补丁也可以(多选)。
- 第一个选定库的补丁显示在补丁列表视图中。
- 当第一个选定的银行发生变化时,我应该重新填充补丁列表视图,因此我需要 Bank 类支持 ObservableCollection(Ex)。
- 补丁只需要支持INotifyPropertyChange(ObservableObject)即可。
- 我宁愿使用 ObservableObject 而不是 INotifyPropertyChanged,因为它提供了一些很好的额外方法(用于验证)。
【问题讨论】:
标签: c# wpf inheritance mvvm