Доступ к элементу управления из 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, например, по этой теме.