2011-11-14 19 views
34

Estoy intentando acceder a un control de usuario que está dentro de la plantilla de control de un control de contenido. Específicamente:Cómo accedo a un elemento de una plantilla de control desde código subyacente

<ContentControl x:Name="MyList" > 
     <ContentControl.Template> 
      <ControlTemplate x:Name="MyControlTemplate"> 
       <Border RenderTransformOrigin="0,0" x:Name="border"> 
        <UserControls:MyControl x:Name="MyControlName" Width="100" ViewModel="{Binding}" /> 

puedo acceder this.MyList pero dice this.MyControlName no se encuentra. ¿Cómo puedo acceder al objeto MyControlName desde código subyacente en esta situación?

Gracias!

+0

Tengo la sensación de que deberías decir lo que intentas lograr, lo más probable es que no tienes que hacer lo que estás pidiendo. – flq

Respuesta

62

que necesita para obtener la plantilla y localizar el control por su nombre en el control de plantilla, algo así como:

var template = MyList.Template; 
var myControl = (MyControl)template.FindName("MyControlName", MyList); 

plantillas son sólo eso: las descripciones abstractas de lo que está por crearse, los controles en las plantillas sólo se existir en el contexto de algo que está siendo templado.


Tenga en cuenta que sólo se debe siempre tener acceso a los elementos dentro de una plantilla de control si eres el autor del control que la plantilla es para. El acceso desde el exterior debe realizarse a través de propiedades y métodos enlazados.

Para plantillas de datos esto es similar. Todas las cosas que necesita acceder deben estar vinculadas a un objeto y el acceso debe ser a través de dicho objeto. Esto es especialmente cierto en los casos de controles de artículos que virtualizan sus artículos, por lo que los elementos ni siquiera existen la mayor parte del tiempo.

4

U también puede obtener el control de cada plantilla agregando el evento Cargado en el control y luego en el código asignar el remitente del evento a alguna variable.

+1

@Krythic, "La simplicidad de esta" respuesta "lo hace ..." Esta respuesta no es más simple que la aceptada. Además de esto, answear más simple es mejor no peor :) –

+0

Mi control estaba enterrado en una cadena de estilos y plantillas personalizadas y este evento me salvó. Gracias. – grinder22

Cuestiones relacionadas