2015-07-30 2 views
1

Я занимаюсь разработкой WPF пользовательского элемента управленияКак доступ к элементам управления в внутри шаблона управления в пользовательском элементе управления

<ResourceDictionary xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MultiSelectComboBox"> 
    <Style TargetType="{x:Type local:MultiSelectComboBox}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:MultiSelectComboBox}"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*" /> 
           <ColumnDefinition Width="Auto"/> 
          </Grid.ColumnDefinitions > 
          <telerik:RadComboBox x:Name="PART_ComboBox" 
               Grid.Column="0" 
               ItemsSource="{Binding ItemsSource,RelativeSource={RelativeSource TemplatedParent}}" > 
           <telerik:RadComboBox.Template> 
            <ControlTemplate> 
             <TextBlock x:Name="PART_ComboText"/> 
            </ControlTemplate> 
           </telerik:RadComboBox.Template> 
           <telerik:RadComboBox.ItemTemplate> 
            <DataTemplate> 
             <StackPanel Orientation="Horizontal"> 
              <CheckBox x:Name="PART_ItemCheckBox"/> 
              <TextBlock x:Name="PART_ItemText"/> 
             </StackPanel> 
            </DataTemplate> 
           </telerik:RadComboBox.ItemTemplate> 
          </telerik:RadComboBox> 
          <CheckBox Grid.Column="1" x:Name="PART_SelectAllCheckBox" VerticalAlignment="Center" IsChecked="{TemplateBinding IsAllSelected}" /> 
         </Grid> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

Я хочу, чтобы получить доступ к PART_ComboText

я могу получить доступ управления определить там с помощью метода GetTempalteChild

part_comboBox = GetTemplateChild("PART_ComboBox") as RadComboBox; 

Но я не могу получить доступ к элементам управления внутри шаблона управления. Пример , который находится в шаблоне управления, не смог получить к нему доступ. Я знаю, что мы не могли получить доступ к шаблонам управления из кода.

Я пробовал этот метод. Он также не работает.

part_comboBox = GetTemplateChild("PART_ComboBox") as RadComboBox; 
var comboBoxTemplate = part_comboBox.Template; 
part_comboText = (TextBlock) comboBoxTemplate.FindName("PART_ComboText", part_comboBox); 

ответ

0

Это, вероятно, потому, что RadComboBox не полностью загружены, когда вы пытаетесь найти TextBlock внутри.

Проверьте его имущество IsLoaded, чтобы узнать, готовы ли они или нет. Если это не так, вам придется отложить выполнение кода до тех пор, пока не будет поднято событие Loaded.

part_comboBox = GetTemplateChild("PART_ComboBox") as RadComboBox; 

if (part_comboBox.IsLoaded) 
{ 
    part_comboText = part_comboBox.FindName("PART_ComboText"); 
    DoStuffWithComboText(part_comboText); 
} 
else 
{ 
    part_comboBox.Loaded = new RoutedEventHandler((o, e) => 
    { 
     part_comboText = part_comboBox.FindName("PART_ComboText"); 
     // Or... part_comboText = part_comboBox.Template.FindName("PART_ComboText", part_comboBox); ... can't remember which one was correct in this case 
     DoStuffWithComboText(part_comboText); 
    } 
} 
+0

Hi Almulo Я пробовал то, что вы предлагали. Тем не менее он дает null. большое спасибо – nadun

Смежные вопросы