2012-06-19 28 views
7

Tengo un stackpanel que contiene una imagen y un bloque de texto. Estoy levantando un evento doble click vez está siendo realizado por el usuario (PS -.. Estoy añadiendo StackPanel y es niños (la imagen y el TextBlock programáticamente si importa)cómo obtener los elementos secundarios de un elemento WPF

Ahora, necesito para obtener el elemento TextBlock dentro del stackpanel, entiendo que debería hacerlo usando DataBinding, pero soy un principiante de WPF, y realmente no he encontrado ningún ejemplo al respecto en la web. Me alegraré por un explicación, muchas gracias!

(he aprendido acerca de enlace de datos hace un tiempo).

+0

¿Por qué está agregando el StackPanel y sus hijos mediante programación? Hay muchas posibilidades de que pueda obtener lo que desea puramente en Xaml, y vincular los clics a un comando, o simplemente hacer referencia a TextBlock por su nombre. –

+0

@MichaelGraczyk Estoy logrando los datos que visualizo (por ejemplo, stackpanel) desde una base de datos. – idish

+0

Casi nunca tendrías que agregar elementos de UI del código. Si la IU no cambia durante el tiempo de ejecución, no debería agregar ningún elemento de IU del código. Puede darle a los elementos un nombre con la directiva x: Name, y luego acceder por ese nombre desde el código subyacente. –

Respuesta

17

Una forma sencilla de conseguir el primer elemento secundario de un tipo determinado (por ejemplo, TextBlock) es la siguiente:

var textBlock = panel.Children.OfType<TextBlock>().FirstOrDefault(); 

O bien obtiene el primer TextBlock o null si no hay ninguno.

+0

¡Excelente! ¡Funciona! Muchas gracias! – idish

0

Es necesario databind TextBlockText (?) elemen t a su clase - de este modo:

En XAML

<TextBlock x:Name="MyTextBlock" 
    Text={Binding ShowThis, Mode=OneWay} /> 

en clase:

public class MyDataContextClass 
{ 
    private string showThis = string.Enpty; 
    public string ShowThis 
    { 
     get {return showThis;} 
     set 
     { 
       showThis = value; 
       if (PropertyChanged != null) 
        PropertyChanged(....); 
     } 
     } 
    } 

y usted debe DataBing Xaml a clase. (? Puede ser en el constructor)

public class MyXamlWindow 
    { 
     public MyXamlWindow() 
     { 
      this.DataContext = new MyDataContextClass(); 
     } 
    } 

Hay mucho de maneras de hacer todo lo anterior

+0

Y, por supuesto, si solo quiere acceder al TextBlock, simplemente puede usar x: Name => MyTextBlock. – astreal

Cuestiones relacionadas