WPF - невозможно получить доступ к элементам шаблона для объектов, созданных во время выполнения - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь создать проверяемый вариант элемента управления ComboBox, используя пользовательский ControlTemplate. Конечная цель - добавить обработчик щелчка для интегрированного CheckBox каждый раз, когда создается новый ComboBoxItem, но когда я использую (CheckBox)template.FindName("myCheckBox", item);, он всегда возвращает ноль.

Вот стиль, который устанавливает ControlTemplate:

<Style x:Key="CheckedComboBoxStyle" TargetType="{x:Type ComboBox}">
    <Setter Property="Margin" Value="8"></Setter>
    <Setter Property="Background" Value="Transparent"></Setter>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ComboBoxItem}">
                <Setter Property="Margin" Value="2" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                            <StackPanel x:Name="myStackPanel" Orientation="Horizontal">
                                <CheckBox x:Name="myCheckBox" Focusable="False" Width="50" Foreground="{StaticResource textBrush}"
                                          IsChecked="{Binding Path=IsChecked, Mode=TwoWay, 
                                    RelativeSource={RelativeSource TemplatedParent}}">
                                    <ContentPresenter></ContentPresenter>
                                </CheckBox>
                                <TextBlock x:Name="myTextBlock" Text="{Binding Name}"  Width="100" />
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

, и вот код, который пытается получить ссылку на CheckBox в коде при каждом добавлении нового элемента в ComboBox:

            ComboBoxItem item = new ComboBoxItem();
            item.Content = system.Name;
            item.Tag = system.Id;
            cbSystems.Items.Add(item);
            item.Loaded += (sender, e) =>
            {
                var template = item.Template;
                CheckBox chkBox = (CheckBox)template.FindName("myCheckBox", item);
                MessageBox.Show(chkBox.Name);
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...