Код: Выделить всё
-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) не расширены.
Если я вручную разверну и свернут 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;
}
Будем очень благодарны за любую помощь или подсказки! Спасибо.
Изменить (обновить):
Я считаю, что проблема не в моем предыдущем коде, а в том, как я обрабатываю передачу идентификатора TestCase. . У меня есть MainWindow, где пользователи могут открыть UserControl с именем «Поиск». Когда окно «Поиск» открыто, оно появляется поверх основного окна. В этом окне «Поиск» пользователь выбирает идентификатор TestCase и нажимает «Поиск».
Я подозреваю, что проблема кроется здесь: идентификатор TestCase пересылается в MainWindow до того, как будет создан UserControl. полностью закрыт, в результате чего пользовательский интерфейс Treeview не обновляется после первого элемента. Похоже, это влияет на выполнение функции FindTviFromObjectRecursive(TestCasesTree, selectedItem), которая возвращает значение Null после раскрытия только первого элемента (элемента, который присутствовал при открытии окна поиска).
Вот соответствующая часть моего 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