Привязка для EntitySet отображает значения, которых нет? - PullRequest
0 голосов
/ 02 августа 2009

Я связываю 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 кэшируется между связками.

Что здесь происходит? Чего мне не хватает ???

Ответы [ 2 ]

0 голосов
/ 02 августа 2009

Я не уверен в этом, но, возможно, ItemsControl прослушивает события из IBindingList или INotifyCollectionChanged, а не INotifyPropertyChanged.

0 голосов
/ 02 августа 2009

Я нашел решение для этого. Это отстой.

Я могу обернуть коллекцию Children в BindingList:

public IBindingList BindableChildren
{
    get
    {
        return new BindingList<Item>(Children);
    }
}

, а затем измените мой метод RemoveChild следующим образом:

this.Children.Remove(arg);
SendPropertyChanged("BindableChildren");

Это приводит к тому, что пользовательский интерфейс немедленно обновляет список и перестает демонстрировать поведение кэширования.

Вопрос остается неизменным: WTF? и Есть ли другой способ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...