2014-10-04 63 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

相關問題