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