Laden...

MVVM Binding mit einer Property einer "globalen" Klasse

Erstellt von Solix0x vor 5 Jahren Letzter Beitrag vor 5 Jahren 950 Views
S
Solix0x Themenstarter:in
12 Beiträge seit 2018
vor 5 Jahren
MVVM Binding mit einer Property einer "globalen" Klasse

Guten Tag liebes Forum,

ich beschäftige mich seit kurzem mit dem MVVM Pattern und bin auf folgendes Problem gestoßen:

Ich habe eine Klasse namens Config, in der Variablen gespeichert sind, worauf alle anderen Klassen im Programm Zugriff haben und sie auch verändern sollen. Zuerst habe ich diese als statische Klasse implementiert, und versucht in XAML zu benutzen. Ich habe auch den DataContext auf eine neue Instanz des ViewModels gesetzt und den Namespace meiner Klassen in XAML eingebungen. Die statische Property lautet insgesamt Config.ToggleAutomaticTranslation.


...
    <CheckBox IsChecked="{Binding Source={x:Static local:Config}, 
    Path=ToggleAutomaticTranslation}"/>
...

Da diese und andere Versuche von mir an eine statische Property zu binden erfolglos waren, habe ich die Config Klasse zu einer normalen Klasse geändert und dem ViewModel eine AppConfigs Property vom Typ Config hinzugefügt.


...
		private Config _config;

		public Config AppConfigs {
			get
			{
				return _config;
			}
			set
			{
				if (value != _config)
				{
					_config = value;
					OnPropertyChanged(nameof(AppConfigs));
				}
			}
		}
...

Im Konstruktor des ViewModels wird die AppConfigs Property mit dem Konstruktor initilisiert und in diesem Konstruktor wird eine Init() Methode aufgerufen, die Daten aus einer Datei einliest und dementsprechend die Werte der AppConfigs setzt, was auch fehlerfrei läuft.

Wenn man die CheckBox klickt, wird ein Command ausgeführt (ToggleAutomaticTranslationCommand), der von ICommand ableitet und eine Action im Konstruktor erhält, speichert und diese in der Execute() Methode ausführt, mit:


...
    AppConfigs.ToggleAutomaticTranslation = !AppConfigs.ToggleAutomaticTranslation;
    OnPropertyChanged(nameof(AppConfigs));
...

In XAML:


...
<CheckBox Content="toggle automatic translation"
							  Command="{Binding ToggleAutomaticTranslationCommand}"
							  IsChecked="{Binding AppConfigs.ToggleAutomaticTranslation, Mode=TwoWay}"
							 />
...

Beim Binding habe ich den Mode auf TwoWay gesetzt, weil man im UI mit einem Klick auf die CheckBox den Wert verändern können soll.

Ich habe genau das gleiche schon mit einer anderen Property umgesetzt. Aber die AppConfigs Property wird nach der Initialisierung an eine Translator Property von der Klasse Translator im ViewModel über den Konstruktor weitergegeben, da diese nicht statisch ist und eine neue Instanz des ViewModels keine gute Lösung ist. Wenn die AppConfigs in der Translator Klasse geändert werden, soll das auch im UI durch das Binding sichtbar werden.

Im ViewModel Konstruktor:


...
    AppConfigs = new Config();
    Translator = new Translator(AppConfigs);
...

Das Problem bei dieser Herangehensweise ist, dass sie beim Programmstart nicht gecheckt ist, obwohl die ToggleAutomaticTranslation auf true gesetzt wurde. Und wenn ich auf die CheckBox klicke und der Command aufgeführt wird, ist das Häckchen nur sehr kurz zu sehen und verschwindet dann wieder.

Wie kann ich vorgehen, um das Problem zu lösen? Danke im Voraus 😃

5.658 Beiträge seit 2006
vor 5 Jahren

Hi Solix0x,

was genau meinst du damit:

Aber die AppConfigs Property wird nach der Initialisierung an eine Translator Property von der Klasse Translator im ViewModel über den Konstruktor weitergegeben, da diese nicht statisch ist und eine neue Instanz des ViewModels keine gute Lösung ist.

Wir reden doch hier nur von einem Boolean-Wert. Was sollte da übersetzt werden? Und wo liegt das Problem mit der Instanz des ViewModels?

Warum verwendest du bei der CheckBox ein TwoWay-Binding UND ein Command zum Setzen des Wertes? Beides wird sich doch jedesmal wieder überschreiben, der Wert wird zweimal geändert, und hat am Ende wieder den ursprünglichen Wert.

Weeks of programming can save you hours of planning