Benutzer mit den meisten Antworten
TwoWay-Binding mit StaticResource

Frage
-
Hallo,
ich lade Einstellungen aus einer separaten Klasse, welche wie folgt im XAML hinterlegt ist:
<Page.Resources> <localSettings:AppSettings x:Key="appSettings"/> </Page.Resources>
Dann Binde ich eine Einstellung folgendermaßen an:
<ToggleSwitch IsOn="{Binding Source={StaticResource appSettings}, Path=Achieved, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Name="ts" x:Uid="WeatherfunctionOnOff" Header="Wetterdaten anzeigen" Margin="5">
Das Binding funktioniert soweit von seitens des ToggleSwitches aus. Ändere ich diesen, überträgt er die Änderung an die Einstellungs-Klasse. Der Wert Achieved ändert sich. Setze ich allerdings den Wert Achieved "manuell" im CodeBehind (ViewModel), so ändert sich der ToggleSwitch nicht mit!
Die Einstellung ruft bereits das PropertyChanged-Event auf.
Im Internet habe ich bruchstücke gefunden, welche das selbe Probleme schildern. Aber keine genaue Antwort.
Weiß jemand rat?
MfG
Die Taschenlampe - Die Erleuchtung für ihr Windows Phone! ------------- Sie wollen selbst APP-Programmierer werden? Kommen Sie auf www.flogersoft.de -> Tutorials und erstellen Sie ihre erste, eigene APP!
Antworten
-
Ich glaube das Problem liegt beim Verständnis was hier statisch ist/sein muss.
Die Klasse muss ganz normal nicht statisch sein. Darum rufe ich oben auch die im XAML erstellte Instanz aus den Resourcen ab und ändere diese - so gibt es keine Probleme.Wenn du im Code die Achieved-Eigenschaft änderst, musst du darauf achten auch die selbe Instanz zu verwenden. Du kannst die Resource auch in die App.xaml verschieben und dann über
(App.Current.Resources["appSettings"] as AppSettings).Achieved
von jeder Klasse aus darauf zugreifen.
Eine wirklich andere Lösung gibt es nicht. Es läuft immer auf eine Instanz hinaus, da XAML mit statischen Dingen nur wenig zurecht kommt. (Hier findest du weitere Ansätze.)
Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert Flo0806 Dienstag, 3. Juni 2014 14:24
Alle Antworten
-
Hallo,
ich kann das Problem bei mir nicht reproduzieren. Ich habe dazu deinen Code in ein neues Windows Phone 8.1 Projekt eingefügt und entsprechend ergänzt:public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Required; } protected override void OnNavigatedTo(NavigationEventArgs e) { } private void Button_Click(object sender, RoutedEventArgs e) { (this.Resources["appSettings"] as AppSettings).Achieved = true; } private void Button_Click_1(object sender, RoutedEventArgs e) { (this.Resources["appSettings"] as AppSettings).Achieved = false; } } public class AppSettings : INotifyPropertyChanged { private bool _Achieved; public bool Achieved { get { return this._Achieved; } set { if (this._Achieved != value) { this._Achieved = value; this.OnPropertyChanged("Achieved"); } } } #region INotifyPropertyChanged Members protected void OnPropertyChanged(string propertyName) { var evt = this.PropertyChanged; if (evt != null) evt(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; #endregion }
Mit den beiden Buttons kann ich in der GUI die Einstellung ändern.
Hast du irgend etwas grundlegend anders gemacht?PS: Auch in Silverlgiht-Phone-Projekten funktioniert es. (Nach diversen Anpassungen im XAML.)
Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hey!
Das klappt auch bei mir. Aber setze den Wert doch mal "im Code" und binde die Buttons daran. Dann wird nichts aktualisiert... Die Buttons bleiben unverändert... Das ist mein Problem. Ich möchte im ViewModel die Einstellung auf True setzen, und der Switch soll mitgehen...
MfG
Die Taschenlampe - Die Erleuchtung für ihr Windows Phone! ------------- Sie wollen selbst APP-Programmierer werden? Kommen Sie auf www.flogersoft.de -> Tutorials und erstellen Sie ihre erste, eigene APP!
-
Eine Änderung im Code wird entweder durch eine Aktion in der GUI ausgelöst oder durch ein Event von irgendwo anders. Ich setze die Eigenschaft im Code, nachdem ich den Button angeklickt habe.
Erkläre bitte was genau du mit "im Code" meinst.Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Ich werde mal genauer :-)
ToggleSwitch.IsOn -> ist genunden an Achieved-Property -> Static
Ändert sich die IsOn-Eigenschaft, übernimmt das Binding den Rest.
Nun ändere ich im Code "manuell" Achieved (Achieved = true, z.B.) -> ToggleSwitch.IsOn bleibt wie es war, keine Veränderung.
Mache ich dies mit einer "Nicht"-Statischen eigenschaft klappt es wie gewollt. Es hagt an der statischen.
Das Two-Way-Binding macht hier probleme...
MfG
Die Taschenlampe - Die Erleuchtung für ihr Windows Phone! ------------- Sie wollen selbst APP-Programmierer werden? Kommen Sie auf www.flogersoft.de -> Tutorials und erstellen Sie ihre erste, eigene APP!
- Bearbeitet Flo0806 Dienstag, 3. Juni 2014 14:08
-
Ich glaube das Problem liegt beim Verständnis was hier statisch ist/sein muss.
Die Klasse muss ganz normal nicht statisch sein. Darum rufe ich oben auch die im XAML erstellte Instanz aus den Resourcen ab und ändere diese - so gibt es keine Probleme.Wenn du im Code die Achieved-Eigenschaft änderst, musst du darauf achten auch die selbe Instanz zu verwenden. Du kannst die Resource auch in die App.xaml verschieben und dann über
(App.Current.Resources["appSettings"] as AppSettings).Achieved
von jeder Klasse aus darauf zugreifen.
Eine wirklich andere Lösung gibt es nicht. Es läuft immer auf eine Instanz hinaus, da XAML mit statischen Dingen nur wenig zurecht kommt. (Hier findest du weitere Ansätze.)
Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert Flo0806 Dienstag, 3. Juni 2014 14:24
-
Oh mein Gott bin ich Doof! Seit 7 Jahren schreibe ich Apps und Programme und dann übersehe ich das! Klar, die Instance war das Problem.....
Dankeschön! Jetzt klappt es natürlich! Hatte im XAML eine andere Instanz der Einstellungen geladen als im ViewModel..
MfG
Die Taschenlampe - Die Erleuchtung für ihr Windows Phone! ------------- Sie wollen selbst APP-Programmierer werden? Kommen Sie auf www.flogersoft.de -> Tutorials und erstellen Sie ihre erste, eigene APP!