2012-04-02 3 views
3

Ich habe ein WPF DataGrid, dessen Datenquelle eine ObservableCollection ist. Es ist eingerichtet locker wie die folgenden:Wie aktualisiere ich die ObservableCollection-Objekteigenschaft aufgrund einer Änderung in einem WPF DataGrid?

public class ItemDataCollection : ObservableCollection<ItemData> 
{ 
} 

public class ItemData : INotifyPropertyChanged 
{ 
    private bool _selected = true; 
    public bool Selected 
    { 
     get 
     { 
      return _selected; 
     } 
     set 
     { 
      if (value != _selected) 
      { 
       _selected = value; 
       NotifyPropertyChanged("Selected"); 
      } 
     } 
    } 
    } 


    _itemDataCol = new ItemDataCollection(); 
     <... fill the _itemDataCol with data here ...> 
    dataGrid1.ItemsSource = _itemDataCol; 

Wenn die Sammlung aktualisiert wird, ein dataGrid1.Items.Refresh() aktualisiert DataGrid1 schön. Wenn ich jedoch die Eigenschaft "Selected" einer Zeile ändere, indem ich das Kontrollkästchen in der dieser Eigenschaft entsprechenden Zeile ein- oder auschecke, wird das Objekt in der Sammlung nicht aktualisiert. Ich habe in das CollectionChanged-Ereignis der ObeservableCollection geschaut, aber das scheint nicht ausgelöst zu werden. Welche Verkabelung benötige ich, damit dataGrid1 die Sammlung aktualisiert?

aktualisiert

Alles, was ich die ItemSource Eigenschaft auf die ObservableCollection einstellen tat und die Spalten automatisch generieren zu lassen. Ich habe seitdem geändert, um direkt zu binden, und fand mehr Details zu dem Problem. Wenn ich das Kästchen einfach ankreuze - wird keine Benachrichtigung ausgelöst. Wenn ich jedoch nach dem Aktivieren des Kontrollkästchens klicke, wird die Sammlung aktualisiert. Hier wird die Bindung:

<DataGridCheckBoxColumn Binding="{Binding Path=Selected, Mode=TwoWay}" Header="Selected"></DataGridCheckBoxColumn> 

Also ich denke, die Frage ist, wie bekomme ich das Update mit, die nach dem Aktivieren oder Deaktivieren Sie das Feld zu schlagen?

Update # 2 (Ich kann nicht beantworten, wie mein rep nicht hoch genug noch ist) OK - ich glaube, ich die Lösung. Wenn ich "UpdateSourceTrigger = PropertyChanged" in die Bindung einfüge, scheint alles zu funktionieren.

Bitte hinterlassen Sie Kommentare, wenn es negative Auswirkungen davon gibt, die ich vermisse. Danke für die Hilfe!

Antwort

4

CollectionChanged ist für Einfügen und Löschen. NotifyPropertyChanged dient zur Aktualisierung eines Artikels. Im veröffentlichten Code implementieren Sie nicht tatsächlich INotifyPropertyChanged.

public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

Und ich denke, es sauberer ist an ein öffentliches Eigentum zu binden, wo Sie _itemDataCol

Ansonsten ist die TwoWay Antwort von celopez3

+0

Entschuldigung - Ich habe die Implementierung von NotifyPropertyChanged weggelassen, um den Beitrag kurz zu halten. Es ist korrekt in meinem tatsächlichen Code implementiert. –

+0

Wird es aufgerufen? Wird set aufgerufen? Versuchen Sie, eine öffentliche Eigenschaft zu binden. Wenn das alles fehlschlägt, versuchen Sie, ItemDataCollection zu umgehen und eine ObservableCollection direkt (zum Testen) zu liefern. – Paparazzi

+0

Ich habe versucht, die folgenden: Öffentlichkeit ausgewählt ist. Das Problem stellt sich heraus, dass die ObservableCollection aktualisiert wird, wenn ich nach dem Aktivieren oder Deaktivieren des Kontrollkästchens triff. Wenn Sie das Kontrollkästchen jedoch aktivieren, reicht das Update nicht aus. –

0

Ich bin mir nicht sicher, ob Sie genügend Informationen in Ihren Post geschrieben haben, aber ich werde versuchen, Ihnen zu helfen. Eine meiner ersten Fragen ist: Wie binden Sie das Kontrollkästchen? Wenn Sie möchten, dass das Kontrollkästchen die beobachtbare Sammlung beeinflusst, müssen Sie eine "bidirektionale" Bindung für das Objekt einrichten. Standardmäßig ist die Bindung "unidirektional" und das Element in Ihrer Sammlung wird nicht automatisch geändert . Eine andere Möglichkeit, dies zu umgehen, wäre das Hinzufügen eines Ereignisses im Kontrollkästchen, das beim Klicken den Wert in der beobachtbaren Sammlung manuell ändert.

+0

Alles, was ich tat, war die ItemSource Eigenschaft auf die ObservableCollection Einstellung und lassen die Spalten automatisch generieren. Ich habe seitdem geändert, um direkt zu binden, und fand mehr Details zu dem Problem. Wenn ich das Kästchen einfach ankreuze - wird keine Benachrichtigung ausgelöst. Wenn ich jedoch nach dem Aktivieren des Kontrollkästchens trete, wird die Sammlung aktualisiert. Hier ist die Bindung: Irgendwelche Ideen? –

2

Ein ObservableCollection hört nicht auf seine Artikel INotifyPropertyChanged Ereignisse zurückzukehren; Verwenden Sie stattdessen eine BindingList.

Mit anderen Worten, [ein ObservableCollection] nur bemerkt, wenn Elemente hinzugefügt oder entfernt werden, nicht , wenn die Werte der Elemente zu ändern, auch wenn diese Elemente INotifyPropertyChanged implementieren.Im Vergleich dazu hört eine BindingList auf INotifyPropertyChanged, und daher werden die Änderungen in dem Raster wiedergegeben, wenn seine Elemente geändert werden. Als Ergebnis werden Gruppierung, Sortierung, und statistische Funktionen aktualisiert.

http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx

0

Die Antwort ist, dass ich die Update auf Property setzen benötigt (siehe Blam Antwort). Zwei-Wege-Bindung schien nicht spezifiziert zu werden. Hier ist das Markup aus dem Arbeitscode:

<DataGridCheckBoxColumn Binding="{Binding Path=Selected, 
    UpdateSourceTrigger=PropertyChanged}" 
    Header="Selected"></DataGridCheckBoxColumn> 
+0

Ich war mit der Website - immer noch neu auf dem Posten . Als ich bemerkt habe, dass es nicht funktioniert hat, habe ich es wieder akzeptiert, aber es hat nicht gedauert. Es war nicht meine Absicht - du hast die akzeptierte Antwort verdient. –

+0

Das ist seltsam, denn es zeigt Ihnen heute akzeptiert und nicht akzeptiert. Die Antwort zeigt ein Häkchen, aber ich habe keinen Kredit bekommen. Bitte versuchen Sie einen einzigen Klick auf das Häkchen. Und wenn ich keinen Kredit bekomme, dann kein Problem. Gut, du hast es funktioniert. – Paparazzi

+0

Hmm. Ich versuchte es erneut zu akzeptieren und zu akzeptieren. Es zeigt Ihren Beitrag als akzeptierte Antwort - zumindest in meinem Browser auf verschiedenen Rechnern. Ich entschuldige mich - Sie waren die Ersten, die Posts hatten, und der Kredit sollte Ihnen gehören. Das ist es, was ich bekomme, wenn ich mit etwas spiele, das nicht kaputt war ... –

Verwandte Themen