Wpf EntitySet的绑定正在显示不存在的值?
我正在将ItemsControl绑定到WPF应用程序中的EntitySet。然而,它并没有像预期的那样发挥作用。ItemsControl的行为就像在绑定之间缓存EntitySet的内容一样 下面是简化的代码: 实体:Wpf EntitySet的绑定正在显示不存在的值?,wpf,linq-to-sql,data-binding,entity,Wpf,Linq To Sql,Data Binding,Entity,我正在将ItemsControl绑定到WPF应用程序中的EntitySet。然而,它并没有像预期的那样发挥作用。ItemsControl的行为就像在绑定之间缓存EntitySet的内容一样 下面是简化的代码: 实体: public partial class Item : INotifyPropertyChanging, INotifyPropertyChanged { private EntitySet<Item> _Children; public EntityS
public partial class Item : INotifyPropertyChanging, INotifyPropertyChanged
{
private EntitySet<Item> _Children;
public EntitySet<Item> Children {get{return _children;}}
/*...*/
}
ScrewyItem.RemoveChild(ScrewyItem.Children.First());
return;
用户界面:
<ItemsControl
Name="ItemChildren"
Background="CornflowerBlue"
ItemsSource="{Binding Children}">
<ItemsControl.ItemTemplate>
<DataTemplate
DataType="{x:Type d:Item}">
<DockPanel>
<TextBlock
Text="{Binding Name}/>
</DockPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
稍后,我将从实体中删除子项:
public partial class Item : INotifyPropertyChanging, INotifyPropertyChanged
{
private EntitySet<Item> _Children;
public EntitySet<Item> Children {get{return _children;}}
/*...*/
}
ScrewyItem.RemoveChild(ScrewyItem.Children.First());
return;
此代码运行后,UI不会更新,并且该项显示为具有所有子项。请注意,此方法调用NotifyPropertyChanged,因此绑定应该更新
稍后,我们将从UI绑定中删除此项:
this.DataContext = Db.Items.Last(); //different item
return;
然后再将其绑定到UI
this.DataContext = ScrewyItem;
您可以假设,至少在这一点上,UI将显示正确的子列表。然而,事实并非如此!它显示的子项列表与最初显示的相同
更奇怪的是,如果我在我的Children访问器上设置一个断点,我可以看到当我重新绑定到UI时,列表被访问,并且列表不包含我删除的子对象
我能看到UI可以这样做的唯一方式是,如果子集合的内容在绑定之间缓存
这是怎么回事?我遗漏了什么?我已经找到了解决方案。这有点糟糕 我可以将Children集合包装在BindingList中:
public IBindingList BindableChildren
{
get
{
return new BindingList<Item>(Children);
}
}
这将导致UI立即更新列表并停止显示缓存行为
问题仍然是remans:WTF?还有其他方法吗?我不确定,但可能ItemsControl正在侦听来自IBindingList或INotifyCollectionChanged而非INotifyPropertyChanged的事件。绑定不会缓存值,是吗?不,我很确定您看到的行为不是缓存的结果,而是绑定而不是wokring的结果,也就是说,控件看不到对数据的更新。根据缓存的定义,绑定在创建时收集对象中的数据,然后侦听通知对象已更改的事件。但是,这意味着,如果值在没有触发它正在侦听的事件的情况下被更改,那么它永远不会触发绑定更新。对于属性,这是INotifyPropertyChanged,因此,如果您更改了项中的值,那么它将起作用,但您没有更改项,您更改了触发ListChanged事件的EntitySet,而不是CollectionChanged事件绑定侦听的EntitySet
this.Children.Remove(arg);
SendPropertyChanged("BindableChildren");