Я немного опоздал на вечеринку, но вот еще одно решение, которое в моем случае безотказно,
После попытки многих решений, предлагающих добавить IsExpanded
и IsSelected
к базовому объекту и привязку к ним в стиле TreeViewItem
, в то время как этот в основном работает , в некоторых случаях он все еще не работает ...
Примечание: моя цель состояла в том, чтобы написать мини-пользовательский вид, похожий на проводник, в котором, когда я щелкаю папку на правой панели, она выделяется в TreeView
, как в Проводнике.
private void ListViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var item = sender as ListViewItem;
var node = item?.Content as DirectoryNode;
if (node == null) return;
var nodes = (IEnumerable<DirectoryNode>)TreeView.ItemsSource;
if (nodes == null) return;
var queue = new Stack<Node>();
queue.Push(node);
var parent = node.Parent;
while (parent != null)
{
queue.Push(parent);
parent = parent.Parent;
}
var generator = TreeView.ItemContainerGenerator;
while (queue.Count > 0)
{
var dequeue = queue.Pop();
TreeView.UpdateLayout();
var treeViewItem = (TreeViewItem)generator.ContainerFromItem(dequeue);
if (queue.Count > 0) treeViewItem.IsExpanded = true;
else treeViewItem.IsSelected = true;
generator = treeViewItem.ItemContainerGenerator;
}
}
Здесь используется несколько трюков:
- стек для расширения каждого предмета сверху вниз
- убедитесь, что используете текущий уровень генератор , чтобы найти предмет (очень важно)
- тот факт, что генератор для предметов верхнего уровня никогда не возвращается
null
Пока все работает очень хорошо,
- нет необходимости загрязнять ваши типы новыми свойствами
- вообще не нужно отключать виртуализацию .