Wpf 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

我正在将ItemsControl绑定到WPF应用程序中的EntitySet。然而,它并没有像预期的那样发挥作用。ItemsControl的行为就像在绑定之间缓存EntitySet的内容一样

下面是简化的代码:

实体:

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");