У меня есть DataTemplate, которому нужно установить свойство IsSelected для контейнера ItemsControl (например, TreeViewItem, ListViewItem или ComboBoxItem).Тем не менее, он не знает тип контейнера, пока не будет передан ему.Поскольку IsSelected не является частью общего базового класса или интерфейса, а также не является общим свойством зависимостей, зарегистрированным в AddOwner для различных классов (Duh, MS !!! WTF нет? !!), я закончил с этим беспорядком ...
if (container is TreeViewItem) {
(container as TreeViewItem).IsSelected = true;
return;
}
if (container is ListBoxItem) {
(container as ListBoxItem).IsSelected = true;
return;
}
if (container is ComboBoxItem) {
(container as ComboBoxItem).IsSelected = true;
return;
}
... которая не только многословна, но и требует от меня ее изменения, если я когда-либо использую другой ItemsControl, который использует разные типы контейнеров!Не хорошо!
Конечно, я мог бы немного улучшить ее, поместив эту логику в методы расширения (черт C # за отсутствие свойств расширения !!) с именами IsContainerSelected и SetContainerSelected и поместив их в UIElement, а затем переместив приведенный выше код внутрьтам, но это просто делает снаружи аккуратнее.Внутри все еще беспорядок.
Моя единственная другая мысль - использовать отражение и искать свойство IsSelected и использовать его, если оно найдено, но я всегда опасаюсь делать подобные вещи.Однако, поскольку нет общего интерфейса или базового класса, я не совсем уверен, что у меня есть выбор.
Для контекста, я делюсь сложным шаблоном данных между несколькими различными ItemsControls и шаблономсам по себе имеет элементы управления, которые могут получать фокус, такие как флажок и текстовое поле.Однако, когда эти элементы управления получают фокус с помощью мыши, базовый элемент контейнера не выделяется, и все, что было выбрано ранее, остается таким.
Мой обходной путь - использовать присоединенное поведение, которое использует события предварительного просмотра для перехватасфокусируйтесь, прежде чем это произойдет, и установите соответствующий элемент соответствующим образом, что прекрасно работает, когда я жестко запрограммировал TreeViewItem или ListBoxItem и т. д., но я не хочу жестко кодировать тип, так как элемент управления на самом деле не должен заботиться.Так что это та часть, которая ломается.
Тьфу !!!Почему MS не зарегистрировала одно и то же присоединенное свойство или хотя бы не создала интерфейс ISelectableContainer? !!