2009-05-12 30 views
2

Ich habe die folgende Ansicht definiert:Invalidate Collection

<CollectionViewSource x:Key="PatientsView" Source="{Binding Source={x:Static Application.Current}, Path=Patients}"/> 

Wo Patient ist die folgende Eigenschaft:

public IEnumerable<Patient> Patients 
{ 
    get 
    { 
     return from patient in Database.Patients 
       orderby patient.Lastname 
       select patient; 
    } 
} 

Irgendwo in meinem Code, ich die Patienten-Datenbank ändern, und ich möchte haben Die Steuerelemente, die diese Daten anzeigen (mithilfe der "Patientenansicht"), werden automatisch benachrichtigt. Was ist ein richtiger Weg, dies zu tun? Kann die CollectionViewSource ungültig oder etwas sein?

Antwort

2

Ich denke, das ist ein bisschen komplexer ist, als es scheint. Die Benachrichtigung Ihrer Client-Anwendung über Änderungen in der Datenbank ist eine nicht-triviale Aufgabe. Aber Ihr Leben ist einfacher, wenn die Datenbank nur von Ihrer Anwendung aus geändert wird - dies ermöglicht es Ihnen, "Erneuerungslogik" zu setzen, wenn Sie die Datenbank ändern.

Ihre "Patienten" -Eigenschaft scheint in einer Klasse vorhanden zu sein (vielleicht ein wenig mehr als eins? :)). Und Sie binden wahrscheinlich einige ListBox an die CollectionViewSource. Anstatt Refresh für die CollectionViewSource aufzurufen, können Sie WPF veranlassen, den Getter erneut aufzurufen. Dazu muss die Klasse mit der Eigenschaft Patients die INotifyPropertyChanged-Schnittstelle implementieren.

Der Code würde wie folgt aussehen:

public class TheClass : INotifyPropertyChanged 
{ 
public IEnumerable<Patient> Patients 
    { 
    get 
    { 
      return from patient in Database.Patients 
        orderby patient.Lastname 
        select patient; 
    } 
    } 

#region INotifyPropertyChanged members 
// Generated code here 
#endregion 

public void PatientsUpdated() 
{ 
    if (PropertyChanged != null) 
    PropertyChanged(this, "Patients"); 
} 
} 

Nun rufen PatientsUpdated() auf einer Instanz von theClass Aktualisierung der Bindung auszulösen.

P.S. Ich habe gesagt, dass es sich irgendwie wie ein schlechtes Design anfühlt.

+0

Alle meine Änderungen werden lokal in der Anwendung vorgenommen, sodass ich die Aktualisierungslogik hinzufügen kann. Der Aufruf von Refresh() hat jedoch keine Auswirkung! –

+0

Ich habe meinen Beitrag mit ein paar weiteren Gedanken verändert. – arconaut

+0

Das ist es. Ich weiß immer noch nicht warum Refresh() nicht funktioniert, aber das funktioniert gut! Danke –

0

Table<T> unterstützt keine IListChanged Ereignisse, Sie müssen dies selbst tun (ich musste heute früher dasselbe tun).

8

Wie ein Collection in Code-behind zu entkräften:

CollectionViewSource patientsView = FindResource("PatientsView") as CollectionViewSource; 
patientsView.View.Refresh(); 
+0

Ich habe diesen Code ausprobiert. Nichts passiert, wenn die Aktualisierung aufgerufen wird! Ich habe einen Haltepunkt auf meiner Patienten Eigenschaft gesetzt: Es wird nicht aufgerufen, wenn Refresh() aufgerufen wird. –

+0

Funktioniert wie ein Charme. Vielen Dank! –