2011-08-24 6 views
7

Analogamente a another question, desidero accedere alla proprietà x: Name di un oggetto tramite codice, in questo caso l'oggetto in questione non è un FrameworkElement e quindi non ha una proprietà Name. Non ho nemmeno accesso alla variabile membro.Come accedere a x: Nome proprietà nel codice - per oggetti non FrameworkElement?

Nella mia situazione, ho un ListView con colonne con nome e vorrei estendere la classe ListView in modo che persista il layout della colonna. Per questa funzionalità ho bisogno di colonne con nome, e per me sarebbe logico riutilizzare la proprietà x: Name che ho bisogno di impostare comunque per altri motivi, invece di aggiungere una proprietà "ColumnName" allegata per esempio.

La mia "soluzione" corrente:

<GridViewColumn Header="X" localControls:ExtendedListView.ColumnName="iconColumn" /> 

desiderata:

<GridViewColumn Header="X" x:Name="iconColumn" /> 

Quindi è possibile ottenere il "x: Name" il valore in qualche modo?

risposta

6

vedere le risposte da parte IANG in questo thread:
How to read the x:Name property from XAML code in the code-behind

Purtroppo, questo non è proprio quello che x: Name fa. x: Il nome non è tecnicamente una proprietà - è una direttiva Xaml. Nel contesto di una domanda di .NET WPF, x: nome significa questo:.

"Voglio essere in grado di avere accesso a questo oggetto attraverso un campo di questo nome Inoltre, se questo tipo capita di avere un nome proprietà, si prega di impostare a quel nome. "

È quella seconda parte che è necessario e purtroppo la seconda parte non si applica a ModelUIElement3D, poiché tale tipo non ha una proprietà per rappresentare il nome. Quindi, in effetti, tutto ciò significa "I desidera poter accedere a questo oggetto tramite un campo di questo nome ". E questo è tutto.

Quindi, tutto x: Name fa è che ti dà accesso a questo oggetto creando un campo con quel nome specifico. Se vuoi ottenere la x: Nome di essa, dovrai iterare tutti i tuoi campi e vedere se il campo è l'oggetto che stai cercando, e in tal caso, restituire il nome del campo.

Lo fa presentare un metodo per fare questo nel codice dietro file di, anche se credo che il tuo approccio attuale con una proprietà associata è una soluzione molto migliore

public string GetName(GridViewColumn column) 
{ 
    var findMatch = from field in this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance) 
        let fieldValue = field.GetValue(this) 
        where fieldValue == column 
        select field.Name; 

    return findMatch.FirstOrDefault(); 
} 
+0

Grazie, che aiuta :) immaginare che attaccato proprietà sono davvero più adatti allora. – floele

Problemi correlati