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绑定,或者我没有将您的问题对齐。
现在很清楚,我认为我不应该预期:
- 增加一个实体的背景下,以反映在UI中。我的ObservableCollection实体与上下文EntitySet断开连接。
- 将实体添加到OberservableCollection以保存在数据库中。同样,它们是断开的,所以添加到OberservableCollection的实体不会神奇地结束于上下文中。
- 从上下文直接对UI使用EntitySet,因为它没有实现INotifyCollectionChanged。
在SO和其他地方有很多关于所有这些的帖子。这篇文章总结得很好,并提到了EF 4。1解决此问题:ObservableCollection better than ObjectSet
至于我原来的问题,为什么添加非根实体DID更新UI,我的猜测是父节点设法触发一个事件,因为它正在其EntityCollection中获取一个新的子项子节点(可能通过ListChanged)。
新实体正在以编程方式创建,而不是通过TreeView。用“添加”按钮思考一个TextBox。 – 2011-08-25 02:37:36