Frage

Ich habe eine Ansicht mit einer listbox, die gebunden ist GetAll():

<DockPanel>
    <ListBox ItemsSource="{Binding GetAll}"
             ItemTemplate="{StaticResource allCustomersDataTemplate}"
             Style="{StaticResource allCustomersListBox}">
    </ListBox>
</DockPanel>

GetAll() ist eine ObservableCollection-Eigenschaft in meinem ViewModel:

public ObservableCollection<Customer> GetAll
{
    get
    {
        return Customer.GetAll();
    }
}

die wiederum ruft ein GetAll () - Modell-Methode die liest eine XML-Datei zu füllen, die ObservableCollection.:

public static ObservableCollection<Customer> GetAll()
{
    ObservableCollection<Customer> customers = new ObservableCollection<Customer>();

    XDocument xmlDoc = XDocument.Load(Customer.GetXmlFilePathAndFileName());
    var customerObjects = from customer in xmlDoc.Descendants("customer")
                          select new Customer
                          {
                              Id = (int)customer.Element("id"),
                              FirstName = customer.Element("firstName").Value,
                              LastName = customer.Element("lastName").Value,
                              Age = (int)customer.Element("age")
                          };
    foreach (var customerObject in customerObjects)
    {
        Customer customer = new Customer();

        customer.Id = customerObject.Id;
        customer.FirstName = customerObject.FirstName;
        customer.LastName = customerObject.LastName;
        customer.Age = customerObject.Age;

        customers.Add(customer);
    }

    return customers;
}

Dies alles funktioniert gut, AUßER wenn der Benutzer wechselt zu einer anderen Ansicht, bearbeitet die XML-Datei und kommt wieder zu dieser Ansicht: die alten Daten werden noch angezeigt wird.

Wie kann ich sagen, dass diese Ansicht auf "refresh seiner Bindungen", so dass es zeigt die tatsächlichen Daten.

Es fühlt sich an wie ich bin zu gehen über WPF-hier mit zu viel von einer HTML - /HTTP-Metapher, ich habe das Gefühl es ist ein natürlicher Weg, um ObservableCollection, sich selbst zu aktualisieren, daher der name, aber das ist der einzige Weg, ich kann Holen Sie sich die Benutzer werden in der Lage zu Bearbeiten Sie Daten in einer WPF-Anwendung im moment.So helfen Sie auf jeder Ebene wird hier sehr geschätzt.

War es hilfreich?

Lösung

Ein ItemsControl fordert seine uns erst verbindlich, wenn und speichert die Referenz darauf.

Wenn der Inhalt des collection-Objekts geändert werden, und es implementiert INotifyCollectionChanged (als ObservableCollection es tut), es werden pick up hinzugefügte oder entfernte Objekt.

Jetzt, wenn Sie möchten, dass die Bindung zur Lieferung einer neuen collection-Objekt, um die ListBox, Sie können Ihr view-Modell implementieren INotifyPropertyChanged und erhöhen PropertyChanged, übergeben GetAll wie der name der Eigenschaft.Dadurch wird die Wirkung der Warnung der Bindung, die den Wert der Eigenschaft geändert wurde (es ist ein neue ObservableCollection bereit, abgeholt zu werden), die es liefert die ListBox, die wird re-generieren der Elemente.

So lange, wie Sie änderungen in Ihrer app, die Arbeit auf der ObservableCollection zurückgegeben GetAll, Sie können hinzufügen und entfernen und die Liste immer synchron.Wenn Sie abholen möchten externer änderungen (haben Sie vielleicht eine Schaltfläche aktualisieren, irgendwo, oder ein natürlicher Punkt, wo es sinnvoll ist, um neu zu laden, ohne die ganze Datei), können Sie Ihren view-Modell heben Sie die PropertyChanged Veranstaltung, die wird automatisch rufen Sie die Eigenschaft getter, die werden rufen Sie die statische Methode wird wieder eine frische neue Kollektion.

Nitpicker Hinweis:warum gibst du Methodennamen Eigenschaften?

Andere Tipps

Unter Leitung Arbeit gleiche, wie wenn wir entfernen Objekt in der Sammlung hinzuzufügen:

CollectionViewSource.GetDefaultView(CustomObservableCollection).Refresh();

einen Verweis auf Ihre ObservableCollection halten und die letzte Änderung Zeit der XML-Datei als die Zeit, die Sie geladen. Jedes Mal, wenn das Fenster den Fokus erhält, überprüfen Sie die Zeitstempel auf der Plattendatei. Wenn es geändert wird, klar und wieder bevölkern die ObservableCollection. Die GUI ist für Änderungsereignisse aus dem ObservableCollection automatisch hören und automatisch wieder füllen, wenn Sie die Sammlung des Inhalts ändern.

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