Я пытаюсь "перенести" мое приложение 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' нельзя использовать в качестве параметра типа 'T' в универсальном типе или методе 'ObservableCollectionEx'. Не существует неявного преобразования ссылок из PcgTools.Synths.Common.Synth.Bank в ObservableObject. G: \ Data \ Eigen \ Informatica \ KorgKronosTools \ KorgKronosTools \ ViewModels \ PcgViewModel.cs 152 45 PcgTools
Мне (кажется) мне нужна эта конструкция, потому что:
Свойство IsSelected в Bank привязано к списку (банки) (который показывает все банки). Можно выбрать несколько банков. Поэтому банки должны поддерживать INotifyPropertyChange (это делает ObservableObject).
- Свойство IsSelected объекта Patch связано с другим представлением списка (представление списка исправлений в том же окне). Патчи также могут быть (многократно выбраны).
- Патчи первого выбранного банка отображаются в виде списка патчей.
- Когда первый выбранный банк изменяется, я должен заполнить представление списка патчей, поэтому мне нужно, чтобы класс Bank поддерживал ObservableCollection (Ex).
- Исправление необходимо только для поддержки INotifyPropertyChange (ObservableObject).
- Я скорее использую ObservableObject вместо INotifyPropertyChanged, потому что он дает несколько хороших дополнительных методов (для проверки).