2009-05-13 8 views
13

Attualmente ho bisogno di una classe personalizzata ListViewItem - chiamiamola MyListViewItem. È necessario disporre di alcuni dati aggiuntivi associati a ciascun elemento ed eseguire alcune operazioni quando viene modificata la proprietà controllata. Ho provato diverse cose, ma attualmente il relativo codice simile a questo:C# ereditarietà e priorità delle proprietà di 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) { 
     // ... 
    } 
} 

Il problema che sto avendo è che quando scatto sopra la casella di controllo della voce nella ListView, il mio setter non viene mai chiamato. Qualcuno sa cosa sto sbagliando? Sono consapevole che potrei usare l'evento ItemChecked del ListView genitore, ma sembra una soluzione molto meno pulita. (Inoltre non sto passando un Object al costruttore, ma quella parte non è importante qui).

+0

Bene, se qualcuno è interessato, ho finito per gestire l'interazione tra i miei dati e la proprietà controllata nel getter/setter per i dati personalizzati. Non sono sicuro del motivo per cui non ci avevo pensato prima. – jnylen

risposta

18

Non funziona causa la parola "nuovo" non ha la priorità è solo "nasconde".

Ciò significa che se si chiama Controllato su un'istanza di oggetto a cui viene fatto riferimento tramite la definizione del tipo di MyListViewItem, il numero eseguirà il codice. Tuttavia, ListView fa riferimento a questo oggetto tramite la definizione del tipo di ListViewItem e pertanto non chiamerà il metodo "nuovo".

"nuovo" è non override. La soluzione migliore è probabilmente gestire il codice in una visualizzazione elenco personalizzata. Non è davvero così brutto.

+0

Questo è ciò che sto facendo attualmente nel gestore list_ItemChecked. Non penso che garantisca un ListView personalizzato, quindi mi limiterò a consultare base.Verificato prima di voler fare qualsiasi cosa con i miei dati personalizzati. Grazie. – jnylen

+0

[Grande articolo su questo argomento] (http://broadcast.oreilly.com/2009/10/understanding-c-using-virtual.html) – Amicable

8

new non override membro base. Dichiara un nuovo metodo con lo stesso nome. In VB.NET si chiama Shadows.

Infatti, new non fa nulla tranne disattivare un avviso del compilatore. Il membro che non si dichiara come override (e lo si può fare solo se il membro base è virtual o override) non sarà completamente correlato all'albero di ereditarietà del membro base.

3

Supponendo che lo ListViewItem. Checked proprietà è virtuale, è necessario eseguire l'override esso:

public override bool Checked 
+0

Non è virtuale. Credo che dovrò fare qualcos'altro. Grazie! – jnylen

1

La proprietà ListViewItem.Checked non è virtuale (vedere MSDN doc here) in modo da non essere in grado di sovrascrivere il comportamento in questo modo. Dovrai utilizzare l'evento o derivare da ListView e sovrascrivere ListView.OnItemChecked per modificare il comportamento.

1

Invece di creare un oggetto ListViewItem personalizzato, perché non creare un tipo separato per contenere i dati personalizzati e quindi assegnare ciascuna proprietà Tag ListViewItem con un riferimento ai dati personalizzati?

Questo è lo schema che uso da un po 'di tempo e funziona molto bene. Per quanto riguarda l'azione personalizzata quando gli oggetti sono selezionati, gestisci semplicemente gli eventi rilevanti nella visualizzazione elenco.

Problemi correlati