Frage

Ich bin die Bindung eines Itemscontrol zu einem EntitySet in einer WPF-Anwendung. Es ist nicht wie erwartet wirkt, jedoch. Die Items verhalten, als ob es Caching der Inhalt des EntitySet zwischen bindet!

Hier ist der abgespeckte Code :

Das Unternehmen:

public partial class Item : INotifyPropertyChanging, INotifyPropertyChanged
{
    private EntitySet<Item> _Children;
    public EntitySet<Item> Children {get{return _children;}}
    /*...*/    
}

Meine partielle Klasse:

public partial class Item
{
    public void RemoveChild(Item child)
    {
        Children.Remove(child);
        // this finds PropertyChanged; defined in the Entity class
        SendPropertyChanged("Children");
    }
}

Die Benutzeroberfläche:

<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>

Code, der das Verhalten zeigt (unter der Annahme> 2 Titel, die jeweils ein einzelnes Kind mit):

this.ScrewyItem = Db.Items.First();
this.DataContext = ScrewyItem;
return;

Später entferne ich das Kind aus der Einheit:

ScrewyItem.RemoveChild(ScrewyItem.Children.First());
return;

Nachdem dieser Code ausgeführt wird, wird die Benutzeroberfläche nicht aktualisiert werden und der angezeigte Artikel alle Kinder haben. Beachten Sie, dass diese Methode aufruft NotifyPropertyChanged, so sollten die Bindungen aktualisieren!

Später, entfernen wir diesen Artikel aus den UI-Bindungen:

this.DataContext = Db.Items.Last(); //different item
return;

Und dann binden Sie es an die UI es später noch einmal

this.DataContext = ScrewyItem;

Sie würden davon ausgehen, dass zumindest in diesem Punkt die UI die richtige Child-Liste zeigen würden. Das ist nicht der Fall , aber! Es zeigt die gleichen Liste der Kinder, wie sie ursprünglich gezeigt!

Was ist noch bizarrer, wenn ich einen Haltepunkt für meine Kinder Accessor setzen, kann ich sehen, dass die Liste zugegriffen wird, wenn ich auf die UI rebind und wird die Liste nicht das Kind enthält I entfernt.

Die einzige Möglichkeit, die ich sehen kann, dass der UI dies könnte zu tun ist, wenn der Inhalt der Sammlung Kinder zwischen bindet zwischengespeichert werden.

Was ist denn hier los? Was bin ich fehlt ???

War es hilfreich?

Lösung

Ich habe eine Lösung gefunden. Es Art von saugt.

Ich kann die Kinder-Kollektion in einer Binding wickeln:

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

und dann meine RemoveChild Methode ändern thusly:

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

Dies führt in der Benutzeroberfläche zur Aktualisierung der Liste sofort und stoppt das Caching-Verhalten zeigen.

Die Frage nach wie vor Remaner:? WTF und Gibt es eine andere Art und Weise

Andere Tipps

Ich bin darüber nicht sicher, aber vielleicht die ItemsControl für Veranstaltungen von IBindingList oder INotifyCollectionChanged hören und nicht INotifyPropertyChanged.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top