0

我有一個自引用層次結構是Ria實體。我將這些實體放入ObservableCollection並將集合綁定到我的TreeView。一切都按預期工作,除了當我將實體添加到樹的根級別時,UI不會更新。Silverlight TreeView - 將項目添加到根節點不會更新TreeView

我在這個網站上發現了完全相同的問題。但是,這些問題的解決方案並不能幫助我。我不知道這個問題是WPF還是Silverlight或者什麼的區別。

相關問題:
WPF TreeView Question 1
WPF TreeView Question 2

我的XAML:

<sdk:TreeView.ItemTemplate> 
    <sdk:HierarchicalDataTemplate ItemsSource="{Binding ChildTeams}"> 
     <TextBlock Text="{Binding Name, Mode=OneWay}"/> 
    </sdk:HierarchicalDataTemplate> 
</sdk:TreeView.ItemTemplate> 

加載實體:

var query = context.GetTeamsQuery(); 
var loadOperation = context.Load(query); 

loadOperation.Completed += (sender, e) => 
{ 
    Entities.Clear(); 

    foreach(var item in loadOperation.Entities.Where(t => t.ParentID == null)) 
    { 
     Entities.Add(item); 
    } 

    treeView.ItemsSource = Entities; 
}; 

添加實體的背景下,一旦新的實體是編程創建人:

context.Teams.Add(team); 
context.SubmitChanges(); 

我的問題的核心是爲什麼添加實體到較低級別的節點工作完美,而添加到根本不是?

我可以手動添加一個團隊到集合(Entities.Add(團隊)),這將更新用戶界面,但不是數據庫。我試圖避免這種邏輯,以防止收集和實體集失去同步。

我開始了這一切僅通過直接綁定到實體集,但具有相同的行爲的ObservableCollection:

treeView.ItemsSource = loadOperation.Entities.Where(t => t.ParentID == null); 

任何幫助表示讚賞。我已經從多方面解決了這個問題,無法讓這個工作順利進行。

回答

0
<TextBlock Text="{Binding Name, Mode=OneWay}"/> 

您是否嘗試過使用TwoWay綁定?

由於您嘗試將數據從UI添加回數據庫,因此您需要在現場安裝TwoWay綁定,或者我沒有將您的問題對齊。

+1

新實體正在以編程方式創建,而不是通過TreeView。用「添加」按鈕思考一個TextBox。 – 2011-08-25 02:37:36

0

現在很清楚,我認爲我不應該預期:

  1. 增加一個實體的背景下,以反映在UI中。我的ObservableCollection實體與上下文EntitySet斷開連接。
  2. 將實體添加到OberservableCollection以保存在數據庫中。同樣,它們是斷開的,所以添加到OberservableCollection的實體不會神奇地結束於上下文中。
  3. 從上下文直接對UI使用EntitySet,因爲它沒有實現INotifyCollectionChanged。

在SO和其他地方有很多關於所有這些的帖子。這篇文章總結得很好,並提到了EF 4。1解決此問題:ObservableCollection better than ObjectSet

至於我原來的問題,爲什麼添加非根實體DID更新UI,我的猜測是父節點設法觸發一個事件,因爲它正在其EntityCollection中獲取一個新的子項子節點(可能通過ListChanged)。