2009-08-01 3 views
0

Ich binde ein ItemsControl an ein EntitySet in einer WPF-Anwendung. Es verhält sich jedoch nicht wie erwartet. Das ItemsControl verhält sich so, als wäre es Caching der Inhalt des EntitySet zwischen bindet!Bindung für ein EntitySet zeigt Werte an, die nicht vorhanden sind?

Hier ist die abgespeckte Code:

Das Unternehmen:

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

Meine Teilklasse:

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

Die UI:

<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 (annehmen> 2 Titel, die jeweils ein einzelnes Kind) zeigt:

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

Später entferne ich das Kind aus dem Unternehmen:

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

Nachdem dieser Code ausgeführt wird, Die Benutzeroberfläche wird nicht aktualisiert, und für das Element werden alle untergeordneten Elemente angezeigt. Beachten Sie, dass diese Methode NotifyPropertyChanged aufruft, damit die Bindungen aktualisiert werden sollten!

Später wir dieses Produkt von den UI-Bindungen entfernen:

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

Und dann binden sie wieder an die UI später

this.DataContext = ScrewyItem; 

Sie würden davon ausgehen, dass AT an dieser Stelle dest die UI würde zeige die korrekte Kinderliste an. Dies ist nicht der Fall, jedoch! Es zeigt die gleiche Liste der Kinder wie ursprünglich gezeigt!

Was noch bizarrer ist, wenn ich einen Haltepunkt für meine Kinder Accessor setzen, das kann ich sehen die Liste zugegriffen wird, wenn ich auf die UIunddie Liste erneut binden das Kind nicht enthalten I entfernt.

Die einzige Möglichkeit, die ich sehen kann, dass die UI das tun könnte, ist, wenn der Inhalt der Children-Auflistung zwischen Bindungen zwischengespeichert wird.

Was geht hier vor? Was vermisse ich???

Antwort

0

Ich habe eine Lösung dafür gefunden. Es ist irgendwie scheiße.

kann ich die Kinder Sammlung 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 ausstellenden Verhalten.

Die Frage bleibt immer noch: WTF? und Gibt es einen anderen Weg?

0

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

+0

Bindungen speichern keine Werte, oder? – Will

+0

Nein, ich bin mir ziemlich sicher, dass das angezeigte Verhalten nicht auf das Zwischenspeichern zurückzuführen ist, sondern auf das Nicht-Wokbing-Binden zurückzuführen ist, dh Aktualisierungen für Ihre Daten werden vom Steuerelement nicht erkannt. –

+0

Abhängig von Ihrer Definition von Cache sammelt die Bindung die Daten im Objekt bei der Erstellung und wartet dann auf das Ereignis, das benachrichtigt, dass sich das Objekt geändert hat. Dies bedeutet jedoch, dass die Aktualisierung der Bindungen nicht ausgelöst wird, wenn der Wert ohne die Ereignisse geändert wird, auf die er hört. Bei einer Eigenschaft ist dies INotifyPropertyChanged. Wenn Sie also den Wert in Ihrem "Item" ändern, würde es funktionieren, aber Sie ändern das Item nicht, wenn Sie das EntitySet ändern, das ein ListChanged-Ereignis auslöst und nicht die CollectionChanged-Ereignisbindungen – MikeT

Verwandte Themen