2009-05-13 11 views
13

Actualmente necesito una clase personalizada ListViewItem - llamémosla MyListViewItem. Necesita tener algunos datos adicionales asociados con cada elemento, y realizar algunas operaciones cuando se modifica la propiedad Comprobada. He intentado varias cosas, pero en la actualidad el código en cuestión se ve así:herencia de C# y anulación de propiedades base

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) { 
     // ... 
    } 
} 

El problema que estoy teniendo es que cuando hago clic en la casilla de verificación del elemento en ListView, mi organismo no se llama. ¿Alguien sabe lo que estoy haciendo mal? Soy consciente de que podría usar el evento ItemChecked del ListView principal, pero parece una solución mucho menos limpia. (Tampoco estoy pasando un Objeto al constructor, pero esa parte no es importante aquí).

+0

Bueno, si alguien está interesado, terminé manejando la interacción entre mis datos y la propiedad Comprobada en el getter/setter para los datos personalizados. No estoy seguro de por qué no pensé en eso antes. – jnylen

Respuesta

18

No está funcionando causa de la "nueva" palabra clave no anularlo sólo "pieles".

Esto significa que si llama a Checked en una instancia del objeto al que se hace referencia mediante la definición de tipo de MyListViewItem, ejecutará el código. Sin embargo, el ListView hace referencia a este objeto a través de la definición de tipo de ListViewItem y, por lo tanto, no llamará a su "nuevo" método.

"nuevo" es no anular. La mejor solución es probablemente manejar el código en una vista de lista personalizada. No es realmente tan feo.

+0

Eso es lo que estoy haciendo actualmente en el controlador list_ItemChecked. No creo que requiera un ListView personalizado, así que simplemente miraré la base. Comprobado antes de que quiera hacer algo con mis datos de artículos personalizados. Gracias. – jnylen

+0

[Gran artículo sobre este tema] (http://broadcast.oreilly.com/2009/10/understanding-c-using-virtual.html) – Amicable

8

new no override miembro base. Declara un nuevo método con el mismo nombre. En VB.NET se llama Shadows.

De hecho, new no hace nada excepto desactivar una advertencia del compilador. El miembro que no declare como override (y solo puede hacerlo si el miembro base es virtual o override) no tendrá ninguna relación con el árbol de herencia del miembro base.

3

Suponiendo que el ListViewItem. Checked propiedad es virtual, es necesario anularlo:

public override bool Checked 
+0

No es virtual. Creo que tendré que hacer otra cosa. ¡Gracias! – jnylen

1

La propiedad ListViewItem.Checked no es virtual (consulte el documento MSDN here) por lo que no podrá anular el comportamiento de esta manera. Tendrá que usar el evento o derivar de ListView e ignorar ListView.OnItemChecked para cambiar el comportamiento.

1

En lugar de crear su propio ListViewItem personalizado, ¿por qué no crear un tipo separado para contener sus datos personalizados y luego asignar cada propiedad ListViewItem Tag con una referencia a los datos personalizados?

Este es el patrón que he estado usando durante un tiempo y funciona muy bien. En cuanto a la acción personalizada cuando los elementos están marcados, simplemente maneje los eventos relevantes en la vista de lista.

Cuestiones relacionadas