如何在用户控制代码中获取模板中使用的控件?

时间:2014-01-08 11:59:36

标签: c# .net wpf xaml

如何在xaml样式模板中使用DataGrid控件在代码中使用它?

<UserControl>
<UserControl.Resources>
    <Style x:Key="MyComboBoxStyle" TargetType="{x:Type ComboBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ComboBox}">
                    <Grid x:Name="MainGrid" SnapsToDevicePixels="true">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="0" MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" />
                        </Grid.ColumnDefinitions>
                        <Popup x:Name="PART_Popup"
                               Grid.ColumnSpan="2">
                            <Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw">

                                <Border x:Name="DropDownBorder">

                                    <DataGrid x:Name="PART_PopupDataGrid" />

                                </Border>
                            </Microsoft_Windows_Themes:SystemDropShadowChrome>
                        </Popup>
                        <ToggleButton Grid.ColumnSpan="2"
                                      Background="{TemplateBinding Background}"
                                      BorderBrush="{TemplateBinding BorderBrush}"
                                      IsChecked="{Binding Path=IsDropDownOpen,
                                                          Mode=TwoWay,
                                                          RelativeSource={RelativeSource TemplatedParent}}"
                                      Style="{StaticResource ComboBoxReadonlyToggleButton}" />
                        <ContentPresenter Margin="{TemplateBinding Padding}"
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                          Content="{TemplateBinding SelectionBoxItem}"
                                          ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
                                          ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
                                          IsHitTestVisible="false"
                                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

    <Grid>
        <ComboBox Name="ComboGrid" Style="{DynamicResource DataGridComboBoxStyle}" />
    </Grid>
</UserControl>

我试图在用户控件中尝试获取DataGrid控件,但不成功:

var v1 = this.FindName("PART_PopupDataGrid");
var v2 = this.Template.FindName("PART_PopupDataGrid", this);
var v3 = ComboGrid.FindName("PART_PopupDataGrid");

我怎样才能在代码中获得此控件?

1 个答案:

答案 0 :(得分:2)

这是一个非常常见的要求。实际上,微软甚至在MSDN上专门为此设置了一个页面是非常普遍的:

  

How to: Find ControlTemplate-Generated Elements

基本上,如果您引用 ComboBox ControlTemplate应用于(让我们称之为ComboBox),那么您应该能够这样做:

DataGrid dataGrid = 
    ComboBox.Template.FindName("PART_PopupDataGrid", ComboBox) as DataGrid;