C # наследование и переопределение базовых свойств - PullRequest
13 голосов
/ 13 мая 2009

У меня сейчас есть потребность в пользовательском классе ListViewItem - назовем его MyListViewItem. Он должен иметь некоторые дополнительные данные, связанные с каждым элементом, и выполнять некоторые операции при изменении свойства Checked. Я пробовал несколько вещей, но в настоящее время соответствующий код выглядит так:

class MyListViewItem : ListViewItem {
    new public bool Checked {
        get {
            return base.Checked;
        }
        set {
            base.Checked = value;
            // do some other things here based on value
        }
    }
    public MyListViewItem(Object otherData) {
        // ...
    }
}

Проблема, с которой я столкнулся, заключается в том, что когда я нажимаю на флажок элемента в ListView, мой установщик никогда не вызывается. Кто-нибудь знает, что я делаю не так? Я знаю, что мог бы использовать событие ItemChecked родительского ListView, но это кажется гораздо менее чистым решением. (Также я на самом деле не передаю Object в конструктор, но эта часть здесь не важна).

Ответы [ 5 ]

18 голосов
/ 13 мая 2009

Это не работает, потому что ключевое слово "new" не переопределяет его, а просто "прячет".

Это означает, что если вы вызовете Checked для экземпляра объекта, на который ссылается определение типа MyListViewItem, вы запустите ваш код. Однако ListView ссылается на этот объект через определение типа ListViewItem и поэтому не будет вызывать ваш «новый» метод.

"new" - это not override. Лучшее решение - это, вероятно, обрабатывать код в настраиваемом представлении списка. Это не так уж и ужасно.

9 голосов
/ 13 мая 2009

new не override член base. Он объявляет новый метод с тем же именем. В VB.NET это называется Shadows.

Действительно, new ничего не делает, кроме отключения предупреждения компилятора. Член, которого вы не объявляете override (и вы можете сделать это, только если base член virtual или override) будет полностью не связан с деревом наследования элемента base.

3 голосов
/ 13 мая 2009

Предполагая, что свойство ListViewItem. Checked является виртуальным, его необходимо переопределить:

public override bool Checked
1 голос
/ 13 мая 2009

Вместо создания собственного настраиваемого ListViewItem, почему бы не создать отдельный тип для хранения ваших настраиваемых данных, а затем назначить каждому свойству тега ListViewItem со ссылкой на настраиваемые данные?

Это шаблон, который я использовал в течение некоторого времени, и он работает очень хорошо. Что касается настраиваемых действий при проверке элементов, просто обработайте соответствующие события в представлении списка.

1 голос
/ 13 мая 2009

Свойство ListViewItem.Checked не является виртуальным (см. Документ MSDN здесь ), поэтому вы не сможете изменить его поведение таким образом. Вам придется использовать событие или наследовать от ListView и переопределить ListView.OnItemChecked , чтобы изменить поведение.

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