2014-10-04 59 views
0

我有一个TreeView。我有一个为TreeViewItems定义的contextMenu。新增项目被添加到集合中,但不包含在treeViewItems中

当我右键点击任何TreeViewItem,我得到一个ContextMenu,它有一个选项,添加一个新的TreeViewItem下用户右键单击的项目。

这里是我的代码:

private void AddContextMenu_Click(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem treeViewItem = null; 

    foreach (TreeViewItem tvItem in StaticHelpers.FindVisualChildren<TreeViewItem>(cityTreeView)) 
    { 
     if (tvItem.Header == ServiceLocator.Instance.SelectedCity) 
     { 
      treeViewItem = tvItem; 
      break; 
     } 
    } 

    AddNewCity(ServiceLocator.Instance.SelectedCity); 

    treeViewItem.IsExpanded = true; 

    City newlyAddedCity = getNewlyAddedCity(ServiceLocator.Instance.Cities); 

    foreach (TreeViewItem tvItem in StaticHelpers.FindVisualChildren<TreeViewItem>(cityTreeView)) 
    { 
     if (tvItem.Header == newlyAddedCity) 
     { 
      treeViewItem = tvItem; 
      break; 
     } 
    } 

    this.RenameContextMenu_Click(treeViewItem, e); 
} 
在上面的代码

现在,如果我继续过去的foreach循环断点,我可以看到,它遍历所有的父项和这些子项的父的IsExpanded是设置为true。

但我也可以注意到,当它循环遍历所有项目时,它不会在集合中获得newAddedCity,并因此导致第二个循环tvItem.Header == newlyAddedCity永远不会变为true。

最后,当计算机完成任务后,我可以在TreeView中看到新增的城市。

更新:

这里是我的AddNewCity方法:

public static void AddNewCity(City parentCity) 
{ 
    City lastAddedCity = ServiceLocator.Instance.Cities.Where(x => x.IsLastAdded == true).Select(x => x).FirstOrDefault(); 
    lastAddedCity.IsLastAdded = false; 

    City newCity = new City() 
        { 
         Id = lastAddedCity.Id + 1, 
         IsLastAdded = true, 
         Name = "New City" 
        }; 

    ServiceLocator.Instance.Cities.Where(x => x.Id == parentCity.Id).FirstOrDefault().Children.Add(newCity); 
    CityMethods.SaveNew(parentCity.Id, ""); 
} 
+0

因此,你的问题只是你不能打断点或面临一些问题添加对象到treeView? – 2014-10-04 09:33:20

+0

是的,上面的代码只是没有达到断点。不,我没有面临任何向treeView添加对象的问题。 – Vishal 2014-10-04 09:34:47

回答

1

树型视图是,当谈到在查看被生成的UI容器。在代码中,您将IsExpanded设置为True,但是UI调度程序没有时间来执行用于生成容器的处理,因为它正忙于执行点击处理程序。


如果你有兴趣看到生成的项目,你需要给UI线程运行一段时间后最后foreach循环之前对其进行处理。

调用与优先级调度UI委托空渲染,使所有与会代表在UI调度排队优先级高于或等于渲染得时间来执行。 (优先级UI刷新渲染)

Dispatcher.Invoke((Action)(() => { }), DispatcherPriority.Render); 

你最后的foreach循环之前,只要将这个代码,你会看到断点被击中。

Dispatcher.Invoke((Action)(() => { }), DispatcherPriority.Render); 
foreach (TreeViewItem tvItem in StaticHelpers.FindVisualChildren<TreeViewItem>(cityTreeView)) 
{ 
    if (tvItem.Header == newlyAddedCity) 
    { 
     treeViewItem = tvItem; 
     break; 
    } 
} 
+1

谢谢Rohit。现在它工作正常。 – Vishal 2014-10-04 09:50:18

+0

不客气Vishal .. :) – 2014-10-04 09:51:16

0

的MVVM方式将是一个新的项目添加到底层集合,而不是到TreeView。

public OberservableCollection<City> MyCollection {get;set;} 

    this.MyCollection.Add(getNewlyAddedCity(ServiceLocator.Instance.Cities)); 

XAML

<TreeView ItemsSource="{Binding MyCollection}"/> 
+0

我正在那样做。看看我的更新部分。 – Vishal 2014-10-04 09:25:57

+0

我只是看到直接处理treeviewitem的东西没有约束力,但如果它适合你,那么一切都好。我的例子根本没有隐藏代码 – blindmeis 2014-10-04 11:44:04

+0

我需要使用代码隐藏功能,因为我想添加拖放,添加,重命名,删除等设施到我的客户端。 – Vishal 2014-10-04 11:45:54

相关问题