В моем приложении MVVM у меня есть древовидная структура, которая должна отображать древовидную структуру при выборе Древовидное представление представляет записи в базе данных. Каждый элемент древовидной структуры загружает своих дочерних элементов по требованию, расширяя элемент при его выборе.
Стиль дерева выглядит так:
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="OverridesDefaultStyle" Value="True"/>
...
<EventSetter Event="Selected" Handler="OnTreeViewItemSelected"/>
Обработчик определяется следующим образом:
private void OnTreeViewItemSelected(object sender, RoutedEventArgs e)
{
if (!Object.ReferenceEquals(sender, e.OriginalSource))
{
return;
}
TreeViewItem item = e.OriginalSource as TreeViewItem;
if (item != null)
{
EventHandler eventHandler = null;
eventHandler = new EventHandler(delegate
{
treeData.LayoutUpdated -= eventHandler;
item.BringIntoView();
});
treeData.LayoutUpdated += eventHandler;
}
}
Это прекрасно работает для уже загруженных предметов.
[Редактировать: фактически родительский элемент выбранного элемента должен быть расширен, а не только загружен]
Если они загружены, древовидные элементы повторяются до тех пор, пока не будет найден искомый элемент, найденный элемент будет выбран и приведенный выше обработчик успешно отобразит его.
Проблема с элементами, которые еще не загружены. В этих случаях мой код получает записи предков искомого элемента, перебирает их, расширяя элементы по мере их прохождения (и, следовательно, загружая дочерние элементы), пока не достигнет искомого элемента. Это выбрано успешно, НО не отображается.
Кто-нибудь знает, как решить эту проблему?
[ОБНОВЛЕНО]
В TreeViewItemViewModel:
public bool IsSelected
{
get { return _isSelected; }
set
{
if (value != _isSelected)
{
_isSelected = value;
if (value == true)
IsExpanded = value;
this.OnPropertyChanged("IsSelected");
}
}
}
public bool IsExpanded
{
get { return _isExpanded; }
set
{
if (_isExpanded == value)
return;
_isExpanded = value;
this.OnPropertyChanged("IsExpanded");
if (_isExpanded &&
_parent != null &&
_parent.IsExpanded == false)
_parent.IsExpanded = true;
LoadChildren();
}
}
Метод LoadChildren () обрабатывает, требует ли дочерняя загрузка загрузки или нет, используя флаг.
ItemContainerStyle
Setter Property = "IsExpanded" Value = "{Binding IsExpanded, Mode = TwoWay}"
Setter Property = "IsSelected" Value = "{Binding IsSelected, Mode = TwoWay}"