Доступ к элементу управления из DataTemplate с его идентифицирующим именем

В моем приложении WPF у меня есть элемент управления ComboBox, который находится внутри Grid Control. В XAML я назначаю имя для ComboBox:

<DataGridTemplateColumn Header="Status">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock VerticalAlignment="Center" Text="{Binding name_ru}" Width="Auto" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox Name="stcom" Style="{DynamicResource ComboBoxStyle}" SelectionChanged="status_SelectionChanged" Height="auto" Width="Auto">
                 <ComboBox.BorderBrush>
                     <SolidColorBrush Color="{DynamicResource Color1}"/>
                 </ComboBox.BorderBrush>
            </ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

С помощью метода FindName(строка) я пытаюсь сослаться на ComboBox с его связанным именем:

ComboBox stcom
        {
            get
            {
                return (ComboBox)FindName("stcom");
            }
        }


 if (stcom != null)
            {
                stcom.ItemsSource = list;
            }

Но очевидно, что контроль не может быть найден, потому что ссылка stcom остается нулевым

Теперь вопрос в том, как обратиться к моему ComboBox, используя его свойство name?

3 ответа

Ответ:

<Style x:Key="CheckBoxStyle1" TargetType="{x:Type CheckBox}">
  <Setter Property="Template">
   <Setter.Value>
    <ControlTemplate TargetType="{x:Type CheckBox}">
     <StackPanel Orientation="Horizontal">
      <Grid>
       <TextBlock Name="tbUserIcon" Text="t1" />
       <TextBlock Name="tbCheck"  Text="✓" />
      </Grid>
     </StackPanel>
    </ControlTemplate>
   </Setter.Value>
  </Setter>
 </Style>

и C#:

checkBox.ApplyTemplate();
var tbUserIcon= (TextBlock)checkBox.Template.FindName("tbUserIcon", checkBox);

не забывайте, что checkBox.ApplyTemplate() стоит перед Template.FindName() это важно!

Сначала вы должны получить доступ к шаблону элемента управления, к которому он был применен, затем вы можете найти элемент шаблона по имени. Взгляните на базу знаний MSDN:

Вы не можете получить доступ к элементам управления, которые являются частью DataTemplate с их именем.

Вы можете попробовать прочитать некоторые обходные пути, например,

Вы также можете взглянуть на десятки постов здесь на SO, например, по этой теме.

Другие вопросы по тегам