Die Bindung für eine EntitySet anzeigt Werte, die nicht da sind?
-
10-07-2019 - |
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 ???
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
.