none
Acceder a un objeto de una DataTemplate desde código C# RRS feed

  • Pregunta

  • Hola, quiero acceder a un elemento del DataTemplate, en este caso quisiera darle el DataBinding a una propiedad Texto del control de usuario GridItemDataBinding pero desde C#, alguien tiene idea de cómo hacerlo?

        <Window.Resources>
            <DataTemplate x:Key="MyDataTemplate">
                <StackPanel >
                    <MyGeneralObjects:GridItemDataBinding x:Name="ItemGrilla"  Margin="5,2.5"/>
                </StackPanel>
            </DataTemplate>
        </Window.Resources>

    martes, 16 de abril de 2013 21:03

Respuestas

  • Hola.

    Como no  das muchos datos de tu código intentaré aclararte como hacerlo con un ejemplo y si tienes alguna duda me dices.

    Primero debes saber que para acceder a un elemento de un DataTemplate debes hacerlo sobre en control que tiene el DataTemplate aplicado.

    Supongamos este XAML:

    <Window x:Class="WpfDataTemplateAcess.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow">
        <Window.Resources>
            <DataTemplate x:Key="MyDataTemplate">
                <StackPanel>
                    <TextBlock x:Name="ItemGrilla"
                               Margin="5,2.5" />
                </StackPanel>
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <ContentControl Name="contentCtrl"
                            ContentTemplate="{StaticResource ResourceKey=MyDataTemplate}" />
        </Grid>
    </Window>

    Para acceder a "ItemGrilla" lo haremos a través de "contentCtrl" que tiene aplicado el DataTemplate. Este sería el código C#:

    using System;
    using System.Windows.Media;
    using System.Windows.Data;
    using System.Windows;
    using System.Windows.Controls;
    
    
    namespace WpfDataTemplateAcess
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                // Nos suscribimos al evento Loaded
                Loaded += MainWindow_Loaded;
            }
    
            void MainWindow_Loaded(object sender, RoutedEventArgs e)
            {
                // Accedemos al DataTemplate en el evento Loaded para asegurarnos que el DataTemplate ya se ha aplicado.
    
                // Para un ContentControl el ContentTemplate realmente se le aplica al ContentPresenter que es el primer hijo.
                // Por lo tanto para acceder al DataTemplate debemos obtener el control que tiene el DataTemplate aplicado, en este
                // caso el ContentPresenter.
                var contentPresenter = VisualTreeHelper.GetChild(contentCtrl, 0) as ContentPresenter;
    
                // Buscamos mediante el método FindName el TextBlock llamado "ItemGrilla"
                // Hay que tener en cuenta que buscamos en el DataTemplate 
                // ASIGNADO a la propiedad ContentTemplate del control contentCtrl, pero como control
                // que tiene APICADO el DataTemplate pasamos el ContentPresenter  de ContentControl.
                var tb = contentCtrl.ContentTemplate.FindName("ItemGrilla", contentPresenter) as TextBlock;
    
                // Creamos un Binding con Path=SourceText y lo aplicamos a la propiedad Text del TextBlock.
                // En XAML sería algo así:
                // <TextBlock x:Name="ItemGrilla" Margin="5,2.5" Text={Binding Path=SourceText}/>
                var bd = new Binding("SourceText");
                tb.SetBinding(TextBlock.TextProperty, bd);
            }
        }
    }
    

    Espero que te sirva.


    Un saludo. Miguel A. González
    _________________________
    No olvides marcar este post como útil si te ha sido de ayuda

    miércoles, 24 de abril de 2013 8:07