Silverlight 在新创建的项目上获取TreeViewItem
必须有比下面更好的方法来获取childItemSilverlight 在新创建的项目上获取TreeViewItem,silverlight,treeview,treeviewitem,itemcontainergenerator,Silverlight,Treeview,Treeviewitem,Itemcontainergenerator,必须有比下面更好的方法来获取childItem TaskItem task = (sender as Canvas).DataContext as TaskItem; TaskItem child = Tasks.CreateTask("New task", task); TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromItem(task) as TreeViewItem;
TaskItem task = (sender as Canvas).DataContext as TaskItem;
TaskItem child = Tasks.CreateTask("New task", task);
TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromItem(task) as TreeViewItem;
item.UpdateLayout();
TreeViewItem childItem = null;
foreach (var i in item.GetDescendantContainers())
{
if (i.GetItem() == child)
childItem = i;
}
出于某些原因,item.ItemGenerator.ContainerFromItemchild无法工作必须是由于刚刚创建的项项容器生成是异步的,因此您不能假设添加项后容器将立即存在。您需要将处理程序附加到事件,以便在容器生成完成时通知您的代码 WPF博士的博客文章很好地描述了该问题,并提供了使用StatusChanged的示例:
private void AddScooby()
{
_scooby = new Character("Scooby Doo");
Characters.Add(_scooby);
CharacterListBox.ItemContainerGenerator.StatusChanged
+= OnStatusChanged;
}
private void OnStatusChanged(object sender, EventArgs e)
{
if (CharacterListBox.ItemContainerGenerator.Status
== GeneratorStatus.ContainersGenerated)
{
CharacterListBox.ItemContainerGenerator.StatusChanged
-= OnStatusChanged;
ListBoxItem lbi = CharacterListBox.ItemContainerGenerator
.ContainerFromItem(_scooby) as ListBoxItem;
if (lbi != null)
{
lbi.IsSelected = true;
}
}
}