Не было простого способа сделать это, поскольку WPF создает вложенные контейнеры для узлов дерева.Так что, как упоминала Рэйчел, путь к предметам, похоже, был подходящим.Но я не хотел слишком сильно отклоняться от встроенного свойства ItemsControl.AlternationIndex, поскольку это то, чего люди ожидают.Поскольку он доступен только для чтения, я должен был получить к нему доступ через отражение, но после этого все стало на свои места.
Прежде всего, убедитесь, что вы обрабатываете события Loaded, Expanded и Collapsed вашего TreeViewItem.В обработчике событий найдите принадлежащий TreeView и выполните набор счетчиков рекурсивных чередований для всех видимых узлов.Я создал метод расширения для его обработки:
public static class AlternationExtensions
{
private static readonly MethodInfo SetAlternationIndexMethod;
static AlternationExtensions()
{
SetAlternationIndexMethod = typeof(ItemsControl).GetMethod(
"SetAlternationIndex", BindingFlags.Static | BindingFlags.NonPublic);
}
public static int SetAlternationIndexRecursively(this ItemsControl control, int firstAlternationIndex)
{
var alternationCount = control.AlternationCount;
if (alternationCount == 0)
{
return 0;
}
foreach (var item in control.Items)
{
var container = control.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
if (container != null)
{
var nextAlternation = firstAlternationIndex++ % alternationCount;
SetAlternationIndexMethod.Invoke(null, new object[] { container, nextAlternation });
if (container.IsExpanded)
{
firstAlternationIndex = SetAlternationIndexRecursively(container, firstAlternationIndex);
}
}
}
return firstAlternationIndex;
}
}
Как вы можете видеть, он проходит через каждый узел и устанавливает собственный индекс чередования.Он проверяет, развернут ли узел, и, если это так, продолжает подсчет дочерних узлов.
Выше я упоминал, что вы должны обработать событие Loaded для TreeViewItem.Если вы обрабатываете только развернутые и свернутые события, вы не получите новые контейнеры, созданные при первом открытии узла.Поэтому вы должны выполнить новый проход, когда дочерний узел был создан и добавлен в визуальное дерево.