public class TreeViewEx : TreeView { public TreeViewEx() { this.Loaded += (s, e) => OnLoaded(); } private void OnLoaded() { if (this.SelectedItem == null && this.Items.Count > 0) { TreeViewItemEx item = TreeViewItemEx.GetChildItem(this, this.Items[0]); if (item != null) { item.IsSelected = true; } } } protected override System.Windows.DependencyObject GetContainerForItemOverride() { return new TreeViewItemEx(); } protected override bool IsItemItsOwnContainerOverride(object item) { return item is TreeViewItemEx; } public void SetInitializeSelectedItem(LinkedListNode<object> dataLink) { Debug.WriteLine("SetInitializeSelectedItem"); if (dataLink == null || dataLink.Value == null) { return; } TreeViewItemEx item = TreeViewItemEx.GetChildItem(this, dataLink.Value); if (item == null && this.Items.Count == 1) { item = TreeViewItemEx.GetChildItem(TreeViewItemEx.GetChildItem(this, this.Items[0]), dataLink.Value); } if (item != null) { if (dataLink.Next != null && dataLink.Next.Value != null) { item.SetInitializeSelectedItem(dataLink.Next); } else { item.IsSelected = true; } } } } public class TreeViewItemEx : TreeViewItem { public TreeViewItemEx() { } protected override System.Windows.DependencyObject GetContainerForItemOverride() { return new TreeViewItemEx(); } protected override bool IsItemItsOwnContainerOverride(object item) { return item is TreeViewItem; } private bool _rendered = false; protected override void OnItemsSourceChanged(System.Collections.IEnumerable oldValue, System.Collections.IEnumerable newValue) { this._rendered = false; base.OnItemsSourceChanged(oldValue, newValue); } protected override void OnRender(DrawingContext drawingContext) { if (!_rendered) { this.SetInitializeSelectedItem(); this._rendered = true; } base.OnRender(drawingContext); } protected override void OnSelected(RoutedEventArgs e) { this.IsExpanded = true; base.OnSelected(e); } private bool _mustInitializeSelectedItem = false; private LinkedListNode<object> _initializeSelectedItem = null; internal void SetInitializeSelectedItem(LinkedListNode<object> dataLink) { if (dataLink == null || dataLink.Value == null) { return; } this._mustInitializeSelectedItem = true; this._initializeSelectedItem = dataLink; if (this._rendered) { this.InitializeSelectedItem(false); } } private void InitializeSelectedItem(bool rendered) { TreeViewItemEx childItem = GetChildItem(this, this._initializeSelectedItem.Value); if (childItem != null) { if (!childItem.IsExpanded && this._initializeSelectedItem.Next != null && this._initializeSelectedItem.Next.Value != null) { childItem.IsExpanded = true; childItem.SetInitializeSelectedItem(this._initializeSelectedItem.Next); } else { childItem.IsSelected = true; } } else { if (this.IsExpanded || rendered) { this.IsSelected = true; } else { this.IsExpanded = true; } } } private void SetInitializeSelectedItem() { if(!this._mustInitializeSelectedItem) { return; } _mustInitializeSelectedItem = false; this.InitializeSelectedItem(true); } public static TreeViewItemEx GetChildItem(ItemsControl container, object data) { if (container == null || data == null) { return null; } try { TreeViewItemEx result = container.ItemContainerGenerator.ContainerFromItem(data) as TreeViewItemEx; if (result != null) { return result; } } catch { } foreach (var item in container.Items) { if (item == null) { continue; } if (item is TreeViewItemEx && (item as TreeViewItemEx).DataContext != null && (item as TreeViewItemEx).DataContext.Equals(data)) { return item as TreeViewItemEx; } if (item.Equals(data)) { return container.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItemEx; } } return null; } }
public void SetInitializeSelectedItem(LinkedListNode<object> dataLink)
var
This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)