Silverlight TreeView - 将项目添加到根节点不会更新TreeView

问题描述:

我有一个自引用层次结构是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); 

任何帮助表示赞赏。我已经从多方面解决了这个问题,无法让这个工作顺利进行。

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

您是否尝试过使用TwoWay绑定?

由于您尝试将数据从UI添加回数据库,因此您需要在现场安装TwoWay绑定,或者我没有将您的问题对齐。

+1

新实体正在以编程方式创建,而不是通过TreeView。用“添加”按钮思考一个TextBox。 – 2011-08-25 02:37:36

现在很清楚,我认为我不应该预期:

  1. 增加一个实体的背景下,以反映在UI中。我的ObservableCollection实体与上下文EntitySet断开连接。
  2. 将实体添加到OberservableCollection以保存在数据库中。同样,它们是断开的,所以添加到OberservableCollection的实体不会神奇地结束于上下文中。
  3. 从上下文直接对UI使用EntitySet,因为它没有实现INotifyCollectionChanged。

在SO和其他地方有很多关于所有这些的帖子。这篇文章总结得很好,并提到了EF 4。1解决此问题:ObservableCollection better than ObjectSet

至于我原来的问题,为什么添加非根实体DID更新UI,我的猜测是父节点设法触发一个事件,因为它正在其EntityCollection中获取一个新的子项子节点(可能通过ListChanged)。