Ошибка наследования классов в дизайне Model / ViewModel - PullRequest
0 голосов
/ 21 февраля 2012

Я пытаюсь "перенести" мое приложение 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, потому что он дает несколько хороших дополнительных методов (для проверки).

1 Ответ

3 голосов
/ 21 февраля 2012

Мой первый вопрос: зачем ты это делаешь? Но если вам действительно это нужно, то звучит так, как будто единственное требование для вашего общего ограничения состоит в том, что тип реализует INotifyPropertyChanged:

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

Вам не нужно реализовывать INotifyPropertyChanged для типа Bank, так как он реализован ObservableCollection<T>

Возможно, вам лучше создать собственный интерфейс (который наследуется от INotifyPropertyChanged) и есть методы, к которым вам нужен доступ. Затем используйте этот пользовательский интерфейс в качестве ограничения вашего универсального типа и внедрите его в ObservableObject и ObservableCollectionEx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...