自定义控件中的GetTemplateChild来自DataGrid的单元模板

时间:2013-11-28 11:42:29

标签: c# wpf datagrid custom-controls

我有一个带有以下DataGrid的wpf c#customControl。 我想在DataTemplate中获取Border,因为我可以使用DataGrid和DataGridTemplateColumn

public override void OnApplyTemplate()
{
     var dataGrid = GetTemplateChild("PART_DataGrid") as DataGrid;
     var tempColumn = GetTemplateChild("PART_TempColumn") as DataGridTemplateColumn;

}

为什么

var timerPointer = GetTemplateChild("PART_Border") as Border;

不起作用(总是为空),我如何获得边框?

<DataGrid x:Name="PART_DataGrid" >
    <DataGrid.Columns>
        <DataGridTemplateColumn x:Name="PART_TempColumn" >
            <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <Border x:Name="PART_Border" >
                </Border>
            </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns> 
</DataGrid>

1 个答案:

答案 0 :(得分:0)

它无法工作的原因是因为您在ControlTemplate范围内搜索,但该元素是在DataTemplate范围内定义的。

以下是如何使其运行的示例。

这就像你拥有的ControlTemplate一样。

<Style TargetType="{x:Type local:CustomControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <StackPanel>
                        <Button x:Name="bttn">
                            <Button.ContentTemplate>
                                <DataTemplate>
                                    <TextBlock x:Name="txtBlock" Text="{Binding}"/>
                                </DataTemplate>
                            </Button.ContentTemplate>
                        click me
                    </Button>
                    </StackPanel>
                </Border>
            </ControlTemplate>

这是OnApplyTemplate方法。

    public override void OnApplyTemplate()
    {
        Dispatcher.BeginInvoke(
            DispatcherPriority.Loaded,
            new Action(
                () =>
                    {
                        var button = this.GetTemplateChild("bttn") as Button;
                        for (DependencyObject child = VisualTreeHelper.GetChild(button, 0);
                             child != null;)
                        {
                            if (child is ContentPresenter)
                            {
                                var parent = (ContentPresenter)child;
                                var element = parent.ContentTemplate.FindName("txtBlock", parent) as TextBlock;
                                if (element != null)
                                {
                                    Console.WriteLine("Found it!");
                                    break;
                                }
                            }

                            if (VisualTreeHelper.GetChildrenCount(child) > 0)
                            {
                                child = VisualTreeHelper.GetChild(child, 0);
                            }
                        }
                    }));

        base.OnApplyTemplate();
    }

如您所见,您首先需要找到合适的范围,然后您可以搜索该元素的名称。