如何在TreeView中设置初始化dataItem? [英] How to set a initialize dataItem in TreeView?
本文介绍了如何在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屋!
查看全文