如何在Click事件中获取我的DataTemplate的父项(在这种情况下为Expander控件)? [英] How can I get the parent (Expander control in this case) of my DataTemplate in a Click Event?

查看:88
本文介绍了如何在Click事件中获取我的DataTemplate的父项(在这种情况下为Expander控件)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,我将此XAML作为UserControl。我需要使用的每个属性都有一个扩展器。在Expander的Header属性中,我完成了绑定到DataTemplate以使用Image Button的操作。我需要的是在单击图像按钮时编辑扩展器内的字段(启用它们)。但是,由于它位于DataTemplate的内部,因此我看不到要它成为主要父级(Expander),然后要求父级(Expander)启用字段的方法。

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.

这是我的XAML的代码(变量以西班牙语显示)

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>

事件运行时,我要求提供Parent和TemplatedParent,但它们都不是我所需的扩展器。

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
    }

感谢您的帮助

推荐答案

来自:此博客

您可以在按钮上运行此方法以获取扩展器

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);
    }
}

这篇关于如何在Click事件中获取我的DataTemplate的父项(在这种情况下为Expander控件)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆