2010-09-02 13 views
5

Ich habe eine Seite in einer WPF-Navigationsstil-Anwendung, die Suchergebnisse anzeigt. Die Seite enthält mehrere datengebundene Steuerelemente. Die Seite selbst funktioniert gut; es führt die Suche durch und gibt Ergebnisse zurück. Die datengebundenen CheckBox-Steuerelemente funktionieren ordnungsgemäß. Wenn ich auf einen Ergebnislink klicke und dann auf die Zurück-Schaltfläche klicke, um zur Ergebnisliste zurückzukehren, sind alle meine CheckBox.IsChecked Datenbindungen unterbrochen. Andere datengebundene Steuerelemente (ComboBoxes, DatePickers usw.) funktionieren weiterhin wie erwartet. Die Bindung an andere Eigenschaften des CheckBox-Steuerelements, z. B. IsEnabled, funktioniert ordnungsgemäß. Aber die Bindung IsChecked bleibt unterbrochen, bis ich die Seite aktualisiere.WPF-MVVM-Datenbindung nach Seitennavigation unterbrochen

Hier ist der XAML verwendet für eine meiner CheckBox Kontrollen:

<CheckBox IsChecked="{Binding IncludeNote}" Content="Note" IsEnabled="{Binding IsBusy, Converter={StaticResource boolNot}}" /> 

Wie Sie sehen können, gibt es nichts Besonderes los hier. Wenn Sie die WPF-App jedoch vorwärts oder rückwärts zur Seite navigieren, wird die Bindung IsChecked unterbrochen, während die Eigenschaft IsEnabled weiterhin funktioniert.

Was geht hier vor? Ist das ein Fehler?

UPDATE: Nachdem ich mit einigen Alternativen herumgespielt habe, entdeckte ich, dass dieses Problem auch das ToggleButton-Steuerelement betrifft, von dem CheckBox abgeleitet ist.

UPDATE2: Und es ist auch für die TextBox.Text -Eigenschaft gebrochen.

Gibt es eine Möglichkeit, die Datenbindungen für diese Steuerelemente zu "aktualisieren"? Oder sollte ich einen anderen Ansatz zur Behebung dieses Problems wählen?

Antwort

5

Anscheinend ist es ist ein Fehler. Hier ist der Fehlerbericht zu Microsoft Connect: Binding does not work after back/forward navigation.

Der Benutzer, der Fehler gemeldet, RQDQ, auch seinen Ansatz mit dem Problem zu tun haben erwähnt:

Die Abhilfe, die ich gefunden habe, ist manuell BindingOperations.SetBinding in der Seite für alle Bindungen während der anrufen Geladene Veranstaltung. Dies scheint zu funktionieren, unabhängig davon, ob explizit oder über die Historie navigiert wird (Zurück-/Vorwärts-Operationen).

Dies ist nur ein Problem in WPF4. Datenbindung funktioniert wie erwartet in .NET 3.5.

Ich hoffe, Microsoft behebt dies schnell. Dies ist ein ernstes Problem für WPF-Apps im Navigations-Stil.

0

Eine einfache Problemumgehung besteht darin, KeepAlive auf true zu setzen. Um sicherzustellen, dass das VIewModel nach dem Laden der vorherigen Seite keinen fehlerhaften Zustand aufweist, wird der DataContext jedesmal im Loaded-Ereignis auf eine neue Instanz gesetzt B. an eine Instanz von ViewModel in Ihrem PageResources-Wörterbuch binden, da sie beibehalten wird).

Eine Standardmethode, die wir zum Binden der Seite an das Ansichtsmodell verwenden, ist ein einfaches an die Seite angehängtes Verhalten.

Dadurch wird sichergestellt, dass die Seite jedes Mal erneut gebunden wird, wenn der Benutzer zur Seite zurückkehrt.Auf diese Weise können Sie auch Ihren bevorzugten IOC-Container zum Erstellen des ViewModels verwenden.

+0

Das größte Problem hier ist, dass es schnell zu einem Speicherverlust (s) führen kann. – ouflak

Verwandte Themen