내 MVVM 응용 프로그램에서 treeviewitem을 선택보기로 가져와야하는 treeview가 있습니다. treeview는 데이터베이스의 레코드를 나타냅니다. 각 트리보기 항목은 선택 될 때 항목을 확장하여 요청시 해당 하위 항목을로드합니다.wpf TreeViewItem BringIntoView가 항상 작동하지 않습니다.
트 리뷰 스타일은 다음과 같이 정의된다 :
<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;
}
}
이 이미로드 된 항목에 대해 완벽하게 잘 작동합니다.
[편집 : 사실 선택한 항목의 부모가 아니라 단지로드보다 확대되어야한다]를 모색 항목이 발견 될 때까지로드하는 경우, treeviewitems이 반복된다
이 발견 된 항목을 선택하고, 위의 처리기가 성공적으로이를보기에 가져옵니다.
문제가 이미로드되지 않은 항목입니다. 이 경우 내 코드는 찾은 항목의 조상 레코드를 가져 와서 항목을 확장하면서 검색된 항목에 도달 할 때까지 항목을 확장 (따라서 하위 항목로드)합니다. 이것은 성공적으로 선택되었지만 볼 수는 없습니다.
누구든지 해결 방법을 알고 있습니까? TreeViewItemViewModel에서
[UPDATE] :
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 속성 = "으로 IsExpanded"값 = setter 속성 = "에 isSelected"값 = "{으로 IsExpanded, 모드 = 양방향 바인딩}" "{에 isSelected 바인딩, 모드 = 양방향}"
itemcontainerstyle의 IsSelected 및 IsExpanded 속성에 관한 코드를 게시하십시오.또한 isslected와 isexpanded에 대한 CS 측의 코드와 subtree 항목을로드하고로드되었음을 나타내는 코드도 있습니다. –