Search code examples
c#wpfxamldatatemplateexpander

How can I get the parent (Expander control in this case) of my DataTemplate in a Click Event?


So I have this XAML as my UserControl. I have an Expander for each property I need to use. In the Header property of the Expander I've done binding to a DataTemplate to use a Image Button. What I need is to edit the fields inside the Expander (put them enabled) when I click the Image Button. But since it is inside of a DataTemplate I don't see the way to ask for it's "major parent" (Expander) and then ask the parent (Expander) to enable the fields.

This is the code of my XAML (the variables are in Spanish)

<UserControl x:Class="Guardian_GUI.Vistas.Recursos.AcordionSupertipos"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="700" d:DesignWidth="1500">

    <UserControl.Resources>
        <DataTemplate x:Key="DataTemplate1">
            <Grid Name="conten"  >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding}" Margin="15 8 15 0" ></TextBlock>
                <Button Click="EditarValores" Background="Transparent" Template="{DynamicResource imagenBoton}" Grid.Column="1"/>

            </Grid>
        </DataTemplate>

        <Style TargetType="DockPanel" x:Key="CeldaPropiedades">

            <Setter Property="Background" Value="#d08e38"/>
            <Setter Property="Margin" Value="5" />
            <Setter Property="MinHeight" Value="35" />

        </Style> 

        <Style TargetType="DockPanel" x:Key="CeldaValores">

            <Setter Property="Background" Value="#d08e38"/>
            <Setter Property="Margin" Value="5" />
            <Setter Property="Height" Value="35" />

        </Style>


    </UserControl.Resources>

    <Grid>

        <ScrollViewer  Name="scroll"  HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Grid.Row="2" Margin="0 0 0 40">

            <StackPanel  >
                <ItemsControl Name="lista" BorderThickness="0"  
                                  ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                                 ItemsSource="{Binding ListaSuperTiposEnumerados}" Margin="0" Padding="0" Background="Transparent">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Expander Header="{Binding Nombre}"  BorderThickness="1" Width="1450"  HeaderTemplate="{DynamicResource DataTemplate1}"  BorderBrush="#8b8b8b" FontFamily="Myriad Pro" FontStyle="Italic" 
                                      FontSize="18" Foreground="#f2f2f2" Background="#333333"  VerticalAlignment="Top" Padding="10" >
                                <ScrollViewer  Height="400" ScrollViewer.VerticalScrollBarVisibility="Auto"  Margin="-10,-10" >
                                    <StackPanel>
                                        <StackPanel  Margin="0 20 0 0" >
                                            <DockPanel   Grid.Row="0" Grid.ColumnSpan="1" Background="#89673c" Margin="5" MinHeight="35">

                                                <TextBlock Effect="{DynamicResource sombra}" TextWrapping="Wrap" FontSize="24" Text="Valores" Grid.Column="0" Grid.Row="0" Margin="0,0,107,0"/>
                                                <CheckBox Content="Editar valores" Name="editadorValores" Margin="0 8 0 0" Foreground="#f2f2f2"/>

                                            </DockPanel>
                                            <Grid Margin="10,0,0,0" >
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="140"/>
                                                    <ColumnDefinition Width="440"/>
                                                    <ColumnDefinition Width="400"/>
                                                    <ColumnDefinition Width="160"/>
                                                </Grid.ColumnDefinitions>

                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="*" />

                                                </Grid.RowDefinitions>



                                                <DockPanel  Grid.Column="0"  Grid.Row="1" Style="{StaticResource CeldaValores}" >
                                                    <TextBlock  Effect="{DynamicResource sombra}" TextWrapping="Wrap"  FontSize="20" Text="Id" Grid.Column="0" Grid.Row="1" Margin="0,0,107,0"/>
                                                </DockPanel>


                                                <DockPanel   Grid.Column="1" Grid.Row="1" Style="{StaticResource CeldaValores}" >
                                                    <TextBlock Name="valores" Effect="{DynamicResource sombra}" TextWrapping="Wrap"  FontSize="20" 
                                                               Text="Nombre" Grid.Column="1"  Grid.Row="1"  IsEnabled="{Binding ElementName=algod, Path=IsChecked}" Margin="0,0,107,0"/>
                                                </DockPanel>

                                                <DockPanel  Grid.Column="2" Grid.Row="1"  Style="{StaticResource CeldaValores}" >
                                                    <TextBlock  Effect="{DynamicResource sombra}" TextWrapping="Wrap"  FontSize="20" Text="Descripción" Grid.Column="2"  Grid.Row="1" Margin="0,0,107,0"/>
                                                </DockPanel>

                                                <DockPanel  Grid.Column="3" Grid.Row="1"  Style="{StaticResource CeldaValores}" >
                                                    <TextBlock Effect="{DynamicResource sombra}" TextWrapping="Wrap"  FontSize="20"  Text="Valor" Grid.Column="3"  Grid.Row="1" Margin="0,0,0,0"/>
                                                </DockPanel>
                                            </Grid>

                                            <ItemsControl Name="lista_2" BorderThickness="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                                                     ItemsSource="{Binding ValoresSuperTipo}" Margin="0 0 0 15" Padding="0" Background="Transparent" 
                                                >
                                                <ItemsControl.ItemTemplate>
                                                    <DataTemplate>
                                                        <Grid Margin="10,5,0,0">
                                                            <Grid.ColumnDefinitions>
                                                                <ColumnDefinition Width="140"/>
                                                                <ColumnDefinition Width="440"/>
                                                                <ColumnDefinition Width="400"/>
                                                                <ColumnDefinition Width="160"/>
                                                            </Grid.ColumnDefinitions>

                                                            <DockPanel  Grid.Column="0"  Style="{StaticResource CeldaValores}" >

                                                                <TextBox ToolTip="{Binding Id}" Effect="{DynamicResource sombra}"  TextWrapping="Wrap" FontSize="16"
                                                                             Text="{Binding Id}" Grid.Column="0" Margin="0,0,0,0" Width="100" IsEnabled="{Binding IsChecked, ElementName=editadorValores}"/>
                                                            </DockPanel>

                                                            <DockPanel  Grid.Column="1"  Style="{StaticResource CeldaValores}" >

                                                                <TextBox ToolTip="{Binding Nombre}"  Effect="{DynamicResource sombra}"   TextWrapping="Wrap" FontSize="16"
                                                                             Text="{Binding Nombre}" Grid.Column="0" Margin="0,0,0,0" Width="400"  IsEnabled="{Binding IsChecked, ElementName=editadorValores}"/>

                                                            </DockPanel>

                                                            <DockPanel  Grid.Column="2"  Style="{StaticResource CeldaValores}" >

                                                                <TextBox ToolTip="{Binding Descripcion}" Effect="{DynamicResource sombra}"  TextWrapping="Wrap" FontSize="16"  Width="360"
                                                                             Text="{Binding Descripcion}" Grid.Column="0" Margin="0,0,0,0"  IsEnabled="{Binding IsChecked, ElementName=editadorValores}"/>
                                                            </DockPanel>

                                                            <DockPanel  Grid.Column="3"  Style="{StaticResource CeldaValores}">

                                                                <TextBox ToolTip="{Binding valor}" Effect="{DynamicResource sombra}"   TextWrapping="Wrap" FontSize="16" Width="120"
                                                                             Text="{Binding valor}" Grid.Column="0" Margin="0,0,0,0"  IsEnabled="{Binding IsChecked, ElementName=editadorValores}"/>

                                                            </DockPanel>

                                                        </Grid>
                                                    </DataTemplate>
                                                </ItemsControl.ItemTemplate>

                                            </ItemsControl>
                                        </StackPanel>

                                    </StackPanel>
                                </ScrollViewer>
                            </Expander>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>

        </ScrollViewer>
        <Button Content="Guardar" Style="{DynamicResource Boton_1}"  HorizontalAlignment="Right" Width="120" VerticalAlignment="Bottom" Grid.Row="3" Click="BotonPersistir"/>
        <Button Content="Volver" Style="{DynamicResource Boton_1}" HorizontalAlignment="Right"  VerticalAlignment="Bottom" Width="120" Margin="0,0,120,0" Click="BotonVolver" />
    </Grid>

</UserControl>

When the event runs I ask for the Parent and TemplatedParent but neither of them are the Expander I need.

 private void EditarValores(object sender, RoutedEventArgs e)
    {
        Button boton = sender as Button;
        var Parent = boton.Parent; //It returns a Grid 
        var TemplatedParent = boton.TemplatedParent; //It returns a ContentPresenter
    }

I appreciate your help


Solution

  • from : this blog
    you can run this method on your button to get the expander

    as:

    Expander expander = FindMyParentHelper<Expander>.FindAncestor(boton);
    
    public static class FindMyParentHelper<T> where T : DependencyObject
    {
        public static T FindAncestor(DependencyObject dependencyObject)
        {
            var parent = VisualTreeHelper.GetParent(dependencyObject);
    
            if (parent == null) return null;
    
            var parentT = parent as T;
            return parentT ?? FindAncestor(parent);
        }
    }