在我的MVVM應用程序中,我有一個樹視圖,應該將treeviewitem帶入選定視圖。樹視圖表示數據庫中的記錄。每個樹視圖項都會在需要時通過擴展項來加載它的子項。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被重複直到尋求項目被找到,找到的項目被選中,上面的處理程序成功將其引入視圖。
問題在於尚未加載的項目。在這些情況下,我的代碼獲取搜索項目的祖先記錄,遍歷它們擴展項目(因此會加載子項)直到它到達所需項目。這是成功選擇,但不會被引入視圖。
有誰知道如何解決這個問題?
[UPDATE] 在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屬性= 「IsExpanded」 VALUE = 「{結合IsExpanded,模式=雙向}」 setter屬性= 「IsSelected」 VALUE = 「{結合IsSelected,模式=雙向}」
可否請您發佈更多關於itemcontainerstyle的IsSelected和IsExpanded屬性的代碼。此外,代碼是在cs端isselected和isexpanded,還有一些關於如何加載子樹並表示它們已加載的代碼 – 2011-03-01 10:29:22