Мне пришлось столкнуться с той же проблемой, и я сделал MVVM-способ.
Во-первых, вы хотите создать свойство, которое будет представлять, развернут ли элемент в вашей модели представления (в основном это помогает MVVM).
В view-модели вашего узла просто добавьте что-то вроде Boolean IsNodeExpanded { get; set; }
.
Внимание: выше только интерфейс! Вы должны уведомить об изменениях с помощью INotifyPropertyChanged.PropertyChanged
, , иначе это не будет работать!
Затем вы хотите подключить его к вашему представлению, и это очень похоже на то, что здесь предложил Энди; использовать стили. Однако его разметки было недостаточно для меня (одна из причин в том, что она не работала).
То, что вы на самом деле хотите сделать, это поместить стиль в древовидное представление ItemContainerStyle
.
<TreeView ...>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding Path=IsNodeExpanded, Mode=TwoWay}" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
И в моем случае это сработало.
<ч />
Примечание 1: избавьте себя от головной боли и убедитесь, что привязка в вышеприведенном стиле является двусторонней привязкой в том виде, как она представлена. Некоторое время назад у меня был проект, когда мне пришлось сделать это заново, я забыл сделать его двусторонним, и даже отладка не помогла.
Примечание 2: Вы должны использовать MVVM для этой функции, я попытался использовать для нее кодовый код, потому что он казался короче (я ленивый) и оказался длинным беспорядком, а не просто потому что это требует рекурсивной функции, а также потому, что скрытые элементы, кажется, не существуют, пока их родитель не открыт. Это не приятно , и это может показаться быстрым способом сделать это, но мой опыт сделал это намного дольше.