2011-08-24 14 views
7

Similar a another question, me gustaría acceder a la propiedad x: Name de un objeto a través del código, difícil en este caso el objeto en cuestión no es un FrameworkElement y por lo tanto no tiene una propiedad de nombre. No tengo acceso a la variable miembro tampoco.Cómo acceder a x: Nombre-propiedad en el código - para objetos que no sean FrameworkElement?

En mi situación, tengo un ListView con columnas con nombre y me gustaría extender la clase ListView para que persista en el diseño de la columna. Para esta funcionalidad necesito columnas con nombre, y para mí tendría sentido reutilizar la propiedad x: Name que necesito establecer de todos modos por otros motivos, en lugar de agregar una propiedad "ColumnName" adjunta, por ejemplo.

Mi "solución" actual:

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

deseado:

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

lo tanto, es posible obtener la "x: Name" valor de alguna manera?

Respuesta

6

Ver las respuestas por IANG en el siguiente hilo:
How to read the x:Name property from XAML code in the code-behind

Por desgracia, eso no es lo bastante x: Nombre hace. x: El nombre no es técnicamente una propiedad; es una directiva Xaml. En el contexto de una aplicación .NET WPF, x: Nombre que esto significa:.

"Quiero ser capaz de tener acceso a este objeto a través de un campo de este nombre Además, si este tipo pasa a tener una nombre de propiedad, establezca en ese nombre. "

Es la segunda parte que necesita, y lamentablemente esa segunda parte no se aplica a ModelUIElement3D, porque ese tipo no tiene una propiedad para representar el nombre. Entonces, en realidad, todo lo que significa es "I quiero poder tener acceso a este objeto a través de un campo con este nombre ". Y eso es todo.

Entonces, todo lo que hace x: Name es que le da acceso a este objeto creando un campo con ese nombre específico. Si desea obtener la x: nombre de la misma, tendrá que repetir todos sus campos y ver si el campo es el objeto que está buscando, y en ese caso, devolver el nombre del campo.

lo hace presentar un método para hacer esto en el código detrás de archivo, aunque creo que el enfoque actual con una propiedad adjunta es una solución mucho mejor

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

Gracias, que ayuda :) Guess que une las propiedades de hecho son más adecuados entonces. – floele

Cuestiones relacionadas