Код: Выделить всё
-Main
--Test Category A
---A.1
----T1
----T2
--Test Category B
---B.1
----T1
----T2
Ожидаемое поведение:
Если выбран T.1, TreeView должен развернуться следующим образом:
Код: Выделить всё
-Main
--Test Category A
---A.1
----T1
Текущее поведение:
При запуске кода только родительский узел (-Main) расширен, но (Категория испытаний A) и (A.1) не расширены.
Код: Выделить всё
-Main
--Test Category A
Код: Выделить всё
-Main
--Test Category A
---A.1
Если я заранее разверну и свернут TreeView вручную, код будет работать так, как ожидалось, полностью раскрываясь и выбирая правильный узел.
вот мой фрагмент кода в файле MainWindow.xaml.cs:
Код: Выделить всё
public void SelectTreeViewItem(TestCaseNode selectedItem)
{
if (selectedItem == null)
return;
TestCasesTree.UpdateLayout();
var tvi = FindTviFromObjectRecursive(TestCasesTree, selectedItem);
if (tvi != null)
{
tvi.IsSelected = true;
tvi.BringIntoView();
}
}
public static TreeViewItem FindTviFromObjectRecursive(ItemsControl ic, object o)
{
if (ic == null)
return null;
TreeViewItem result = null;
foreach (object item in ic.Items)
{
TreeViewItem tvi = ic.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
if (tvi != null)
{
tvi.IsExpanded = true;
tvi.UpdateLayout();
if (item.Equals(o))
{
result = tvi;
}
TreeViewItem childResult = FindTviFromObjectRecursive(tvi, o);
if (childResult != null)
{
result = childResult;
}
}
}
return result;
}
Код: Выделить всё
TreeViewItem tvi = ic.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
Почему TreeView не раскрывается полностью и выбрать узел с первой попытки? Как я могу изменить код, чтобы гарантировать, что TreeView работает должным образом, не требуя ручного вмешательства?
Будем очень благодарны за любую помощь или подсказки! Спасибо.
Изменить (подробнее):
У меня есть главное окно, где пользователи могут открыть пользовательский элемент управления с именем «Поиск». Когда окно «Поиск» открыто, оно появляется поверх основного окна. В этом окне «Поиск» пользователь выбирает идентификатор TestCase и нажимает «Поиск».
Идентификатор TestCase пересылается в главное окно.
Вот соответствующая часть моего UserControl MainWindowViewModel.cs:
Код: Выделить всё
public TestCaseNode SelectedTreeViewItem
{
...
set
{
...
((MainWindow))Application.Current.MainWindow).SelectTreeViewItem(value);
}
}
public void HighlightAndSelectTestCase(TestCaseNode testCase)
{
...
SelectedTreeViewItem = testCase;
}
Код: Выделить всё
public SearchWindowVM(MainWindowViewModel mainWindowViewModel)
{
// Code initialization...
NotifyMainWindow = (testCase) =>
{
_mainWindowViewModel.HighlightAndSelectTestCase(testCase);
};
}
public void CloseClick()
{
if (SelectedTestCase != null)
{
DialogHost.CloseDialogCommand.Execute(null, null);
NotifyMainWindow?.Invoke(SelectedTestCase);
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... elect-item