Тема WPF TreeViewItems с различными шаблонами управления - PullRequest
2 голосов
/ 28 апреля 2011

Я пытаюсь создать разные темы для пользовательского элемента управления PropertyGrid, который наследуется от TreeView и использует TreeViewItems в качестве контейнеров элементов. Кроме того, я хочу установить шаблон элемента управления для TreeViewItems на основе типа объекта, с которым связан TreeViewItem. Я бы предпочел заполнить PropertyGrid, как я сейчас, установив ItemsSource.

В настоящее время я применяю различные шаблоны элементов управления, основанные на типе связанного объекта, устанавливая TreeViewItems.ItemContainerStyleSelector через HierarchialDataTemplate. В этом селекторе стилей я возвращаю статический ресурс через ключ ресурса. Я хотел бы не использовать этот метод селектора и ключа ресурса, а создать различные производные объекты TreeViewItem в зависимости от типа объекта, с которым он должен быть связан. Это позволило бы мне применять другой стиль для каждой темы в зависимости от типа, так же как и другие элементы управления. Но я не вижу способа сделать это. Переопределение ItemsControl.GetContainerForItemOverride будет делать то, что я хочу, если ему будет передан объект, с которым будет связан объект, или, по крайней мере, его тип, но я не вижу способа заставить это работать. Есть идеи, как это сделать? Или я все про него ошибаюсь?

1 Ответ

1 голос
/ 28 апреля 2011

Лучше всего было бы добавить настраиваемое свойство зависимостей только для чтения в пользовательский TreeViewItem.Из-за отсутствия лучшего названия, давайте назовем это «Look».Это свойство может быть перечислением с различными стилями или стилями, которые вы хотите применить.

Затем вы можете создать один стиль для вашего собственного TreeViewItem, который использует триггеры стилей на основе вашего свойства Look для изменения шаблона или различныхдругие свойства.

Затем вы можете установить свойство Look в PrepareContainerForItemOverride в зависимости от заданного элемента.

В общем, ItemsControl ожидает, что их «контейнер» будетбыть одного типа, но это не строго соблюдается.Но, как вы сказали, вы не можете создавать разные контейнеры, основанные на элементе, который он упаковывает.

Кроме того, виртуализация добавляет немного сложности в смесь.Как и в этом случае, контейнеры могут использоваться повторно, поэтому у вас не будет возможности «создать» новый тип свойства.Но даже при включенной виртуализации будет вызываться PrepareContainerForItemOverride.

...