[C#] PropertyChanged bei Tabwechsel

holy

Lieutenant
Registriert
Aug. 2008
Beiträge
534
Hallo ihr,

Zeit für eine Frage ;) Bin momentan etwas am Verzweifeln.
Ich hoffe, ich kann es einigermaßen verständlich beschreiben.

Also, es geht um eine WPF App.
In meinem MainWindow gibt es eine ContentControl, in die ich dynamisch TabControls lade.

MainWindow.xaml:
Code:
<ContentControl Content="{Binding Path=Tabs}" ContentTemplate="{StaticResource TabsTemplate}" />

Resources.xaml
Code:
<DataTemplate x:Key="TabsTemplate">
        <TabControl IsSynchronizedWithCurrentItem="True" 
                    ItemsSource="{Binding}"
		    ItemContainerStyle="{StaticResource TabStyle}"
                    ItemTemplate="{StaticResource ClosableTemplate}"
		    Background="{StaticResource DefaultBackground}"
                    Margin="4" />
</DataTemplate>

Am einfachsten stellt man sich die App wie Visual Studio selbst vor. Alles, was man anzeigen kann, wir in solch einen Tab geladen. Der Inhalt der Tabs sind UserControls mit entsprechendem ViewModel dahinter.

Das Problem ist nun folgendes:
Es gibt einen Tab Settings (es soll so bleiben, kein seperates Fenster :)) In dem Tab gibt es mehre TextBoxes (data bound). Wenn ich nun den Text ändere oder auch irgendwas Anderes (z.B. eine CheckBox oder einen RadioButton) und dann nicht den Fokus ändere und nur den Tab wechsel, wird kein PropertyChanged ausgelöst.
D.h. geh ich dann zurück auf den SettingsTab, ist der zuletzt geänderte Wert der Alte. Die letzte Eingabe wird verworfen. Ich habe einfach mal einen BreakPoint auf das entsprechende Property im Model gesetzt, aber es passiert einfach nichts, wenn ich den Tab wechsel. Ändere ich vorher den Fokus auf irgendeine x-beliebe andere Control funktioniert es wie gewollt. Versteh das Problem leider nicht ;(

Hat jemand evtl. eine Ahnung, woran es liegen könnte?

Vielen Dank im Voraus.

Gruß
 
Zuletzt bearbeitet:
wenn ich dich richtig verstanden habe könnte es dir helfen wenn du auf das Event TabIndexChanged reagierst und speicherst.
 
Der standardmäßige "UpdateSourceTrigger" der meisten Input-Control-Properties (wie TextBox.Text etc.) ist "LostFocus". D. h. das Binding wird erst aktualisiert wenn das Control den (logischen) Fokus verliert.
Sobald du den Tab wechselst wird der Visual Tree des Tabs "zerstört". Deshalb tritt vermutlich auch kein "LostFocus" auf und somit wird auch das ViewModel nicht über das Binding aktualisiert.

Du kannst den "UpdateSourceTrigger" der Bindings an dein ViewModel auch auf "PropertyChanged" setzen. Dann wird das Binding bei jeder Änderung (bei TextBox bei jedem eingegebenen Zeichen) sofort aktualisiert. Damit sollte der Tab-Wechsel kein Problem mehr machen.

Interessant zum Thema ist auch dieser Thread im MSDN-Forum: Persisting state when using Tab Control
 
Zuletzt bearbeitet:
Perfekt, vielen Dank.

Der Trick mit dem Adorner funktioniert leider nicht wie gewünscht, aber den Trigger zu ändern schaft Abhilfe.

Gruß
 
Zurück
Oben