Ошибка привязки CustomControl перед тем, как OnApplyTemplate сможет установить DataContext для корневого элемента - PullRequest
0 голосов
/ 23 октября 2019

У меня есть пользовательский контроль. ControlTemplate находится в файле Generic.xaml. Класс элемента управления содержит переопределение метода OnApplyTemplate.

public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        var textBox = Template.FindName("PART_textBox", this) as TextBox;
        if (textBox != null)
        {
            textBox.GotFocus += PART_textBox_GotFocus;
            textBox.LostFocus += PART_textBox_LostFocus;
        }

        var grid = Template.FindName("PART_grid", this) as Grid;
        if (grid != null)
        {
            grid.DataContext = this;
        }
    }

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

Проблема возникает, когда в представлении используется мой пользовательский элемент управления. Во время инициализации элемента управления ошибки привязки отображаются в консоли. Все привязки из элементов управления в шаблоне настраиваемого элемента управления и контекста данных не выполняются в первый раз, поскольку контекст данных еще не установлен. Как только в пользовательском элементе управления вызывается OnApplyTemplate (все еще говорится о «инициализации»), устанавливается текстовый текст данных, и все работает правильно. Это не видимая проблема, пользователь не заметит этого вообще. Но ошибки отображаются в консоли, что означает, что я делаю что-то не так. Установка DataContext в конструкторе пользовательского элемента управления не поможет, потому что (встроенное) свойство Template на этом этапе не задано.

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

1 Ответ

0 голосов
/ 23 октября 2019

Вы можете связать свойство самого элемента управления в XAML, используя {RelativeSource TemplatedParent} или {RelativeSource AncestorType=local:YourControl}.

Вы не должны устанавливать DataContext элемента управления в OnApplyTemplate(). Это предотвратит ваш элемент управления от наследования DataContext от родительского элемента в дереве элементов, как и следовало ожидать в качестве потребителя элемента управления.

...