Я связываю ItemsControl с EntitySet в приложении WPF. Однако не действует, как ожидалось. ItemsControl ведет себя так, как если бы он кэшировал содержимое EntitySet между связываниями!
Вот урезанный код :
Сущность:
public partial class Item : INotifyPropertyChanging, INotifyPropertyChanged
{
private EntitySet<Item> _Children;
public EntitySet<Item> Children {get{return _children;}}
/*...*/
}
Мой неполный класс:
public partial class Item
{
public void RemoveChild(Item child)
{
Children.Remove(child);
// this finds PropertyChanged; defined in the Entity class
SendPropertyChanged("Children");
}
}
Пользовательский интерфейс:
<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>
Код, демонстрирующий поведение (предположим,> 2 элемента, каждый из которых имеет одного ребенка):
this.ScrewyItem = Db.Items.First();
this.DataContext = ScrewyItem;
return;
Позже я удаляю ребенка из сущности:
ScrewyItem.RemoveChild(ScrewyItem.Children.First());
return;
После запуска этого кода пользовательский интерфейс не обновляется, и показано, что элемент имеет все дочерние элементы. Обратите внимание, что этот метод вызывает NotifyPropertyChanged, поэтому привязки должны обновляться!
Позже мы удалим этот элемент из привязок пользовательского интерфейса:
this.DataContext = Db.Items.Last(); //different item
return;
А потом снова связать его с пользовательским интерфейсом
this.DataContext = ScrewyItem;
Вы бы предположили, что по крайней мере на этом этапе пользовательский интерфейс будет отображать правильный список дочерних элементов. Это , а не , дело , однако! Он показывает такой же список детей, как показано на рисунке!
Что еще более странно, если я поставлю точку останова на свой элемент доступа Children, я смогу увидеть, что список доступен, когда я снова привязываюсь к интерфейсу и списка не содержит ребенка, которого я удалила.
Единственный способ убедиться, что пользовательский интерфейс может это делать, - это если содержимое коллекции Children кэшируется между связками.
Что здесь происходит? Чего мне не хватает ???