如何在TreeView中设置初始化dataItem? [英] How to set a initialize dataItem in TreeView?

查看:88
本文介绍了如何在TreeView中设置初始化dataItem?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个TreeView,它的DataContext是一个DynamicCollection(当选择TreeViewItem或扩展它以加载集合时)。



现在,我想设置初始化所选项目,但是失败。



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.

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;
    }
}

推荐答案

验证方法中数据对象的空值

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





它可能会解决此问题的根本原因



It may catch the root cause of this issue


演示应用程序项目下载链接:



http://files.cnblogs。 com / Daview / WpfApplication1.zip [ ^ ]
Demo Application Project Download Link:

http://files.cnblogs.com/Daview/WpfApplication1.zip[^]


谢谢大家!



这个问题太久了,对不起抱歉。
thanks every guy!

the question is too long time ago, sorry and sorry.


这篇关于如何在TreeView中设置初始化dataItem?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆