2009-05-13 4 views
13

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

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, но это похоже на гораздо менее чистое решение. (Также я не передаю объект объекту конструктору, но эта часть здесь не важна).

+0

Ну, если кому-то интересно, я закончил обработку взаимодействия между моими данными и проверенным свойством в getter/setter для пользовательских данных. Не знаю, почему я об этом не думал раньше. – jnylen

ответ

18

Это не работает причина «новой» ключевое слово не переопределить его просто «шкура».

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

"новый" - не переопределить. Лучшее решение - это, вероятно, обработать код в пользовательском представлении списка. На самом деле это не так уродливо.

+0

Вот что я сейчас делаю в обработчике list_ItemChecked. Я не думаю, что это гарантирует пользовательский ListView, поэтому я просто посмотрю на base.Checked, прежде чем я хочу что-либо сделать с данными пользовательских элементов. Благодарю. – jnylen

+0

[Большая статья на эту тему] (http://broadcast.oreilly.com/2009/10/understanding-c-using-virtual.html) – Amicable

8

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

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

3

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

public override bool Checked 
+0

Это не виртуально. Думаю, мне просто нужно сделать что-то еще. Благодаря! – jnylen

1

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

1

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

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

Смежные вопросы