Я пытаюсь выбрать несколько дочерних элементов в древовидной структуре. Все дочерние узлы связаны с коллекцией объектов настраиваемого класса, то есть View.cs. Обратите внимание, что у treeview нет treeview-items, но есть настраиваемый класс, с которым он связан.
Следующий код, который я использовал для выбора нескольких узлов, работает отлично (я проверил его отладкой). Но он не выделяет несколько выбранных дочерних узлов в пользовательском интерфейсе. Мне нужна визуальная обратная связь, чтобы пользователь знал, сколько узлов он выбрал.. Я не уверен, как это исправить, был бы признателен за любую помощь.
List<View> selectedViewItems = new List<View>();
private static readonly PropertyInfo IsSelectionChangeActiveProperty = typeof(TreeView).GetProperty(
"IsSelectionChangeActive",
BindingFlags.NonPublic | BindingFlags.Instance
);
public static void AllowMultiSelection(TreeView treeView)
{
if (IsSelectionChangeActiveProperty == null) return;
SelectMultipleItemsOnTreeView(treeView, SheetManagerUserControl.Instance.selectedViewItems);
}
private static void SelectMultipleItemsOnTreeView(TreeView treeView, List<View> selectedItems)
{
treeView.SelectedItemChanged += (a, b) =>
{
var treeViewItem = treeView.SelectedItem as View;
if (treeViewItem == null) return;
// allow multiple selection
// when key key is pressed
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{
// delete selection change notification
// select all items
// restore change notifications
var isSelectionChangeActive = IsSelectionChangeActiveProperty.GetValue(treeView, null);
IsSelectionChangeActiveProperty.SetValue(treeView, true, null);
selectedItems.ForEach(item => item.IsSelected = true);
IsSelectionChangeActiveProperty.SetValue
(
treeView,
isSelectionChangeActive,
null
);
}
else
{
// deselect all selected items except the current one
selectedItems.ForEach(item => item.IsSelected = (item == treeViewItem));
selectedItems.Clear();
}
if (!selectedItems.Contains(treeViewItem))
{
selectedItems.Add(treeViewItem);
}
else
{
// deselect if already selected
treeViewItem.IsSelected = false;
selectedItems.Remove(treeViewItem);
}
};
}
Я не знаю, насколько это полезно, но у меня есть проект с множественным выбором в TreeView, использующий прикрепленное поведение, основанное на пример на этой странице, которое само основано на пример на этой странице.





Вы можете написать ItemTemplate, который отображает выделение выделения.