Click here to Skip to main content
15,894,405 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I have a TreeView, it's DataContext is a DynamicCollection (when a TreeViewItem is Selected or is Expanded to load the collection).

Now, I want to set the initialize selected item, but failure.

C#
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;
    }
}
Posted
Comments
RAJI @Codeproject 3-Nov-11 4:27am    
so long Code!!!:-(

Verify null values of data objects within the method
C#
public void SetInitializeSelectedItem(LinkedListNode<object> dataLink)


It may catch the root cause of this issue
 
Share this answer
 
Comments
daview 4-Nov-11 23:36pm    
Sorry, I can't understand about of your comment.

But, anyway, thank you!

the next is the demo project:

http://files.cnblogs.com/Daview/WpfApplication1.zip
Demo Application Project Download Link:

http://files.cnblogs.com/Daview/WpfApplication1.zip[^]
 
Share this answer
 
thanks every guy!

the question is too long time ago, sorry and sorry.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900