2012-12-05 14 views
7

Ich habe Kontrollkästchen in meiner XAML + C# Windows Store-Anwendung. Auch ich habe bool Eigenschaft: WindowsStoreTestApp.SessionData.RememberUser, die öffentlich und statisch ist.XAML Bindung an Eigenschaft

Ich möchte Kontrollkästchen Eigenschaft IsChecked konsistent (oder gebunden oder zugeordnet) zu diesem Bool-Eigenschaft.

Ich versuchte dies: XAML

<CheckBox x:Name="chbRemember1" IsChecked="{Binding Mode=TwoWay}"/> 

C#

chbRemember1.DataContext = SessionData.RememberUser; 

-Code für Immobilien:

namespace WindowsStoreTestApp 
{ 
    public class SessionData 
    { 
     public static bool RememberUser { get; set; } 
    } 
} 

Aber es scheint nicht zu funktionieren. Kannst du mir helfen?

+0

Können Sie klären, was nicht funktioniert? Ist es eine zweiseitige Aktualisierung, die nicht funktioniert? Funktioniert es überhaupt nicht? Können Sie auch den Code für SessionData (insbesondere RememberUser) anzeigen? Das wird uns helfen, das Problem zu diagnostizieren. –

+0

Wenn sich einer von ihnen ändert, sollte sich auch der zweite ändern. – imslavko

+0

Was auch immer ich ändere, Mapping funktioniert nicht. Ich habe versucht, Eigenschaft im Code zu ändern, Kontrollkästchen hat nicht überprüft. Versucht gegenüber, checked checkbox, dann im Debugger angezeigt, Eigenschaft hat sich nicht geändert – imslavko

Antwort

3

Sie müssen eine Form der Änderungsbenachrichtigung implementieren, damit Ihr Kontrollkästchen alle Änderungen an der Eigenschaft "kennt". Am besten verwenden Sie eines der vielen MVVM-Frameworks, wenn nicht, implementieren Sie INotifyPropertyChanged in Ihrem ViewModel.

auch, in der Regel in WPF, setzen wir nicht die Datacontext der einzelnen Kontrollen, sondern setzen Sie die Datacontext des Fensters oder der User Control zu einem Ansichtsmodell ...

Hier ist ein Beispiel für eine Eigenschaft mit Änderungsbenachrichtigung durch einer der MVVM Rahmen:

private bool createTrigger; 
public bool CreateTrigger 
{ 
    get { return createTrigger; } 
    set { createTrigger = value; NotifyPropertyChanged(m => m.CreateTrigger); } 
} 

Da Sie nicht für die Datenbindung in WPF ...

verwendet werden, kann eine einfache auto-implementierten Eigenschaft sehen ich würde empfehlen, durch Data Binding Overview über auf MSDN gehen ..

+0

Vielen Dank für Ihre Antwort. Gibt es eine einfache Möglichkeit, nur eine Eigenschaft zu binden? Ich möchte nicht Tonnen von Code nur für eine Eigenschaft generieren, dann ist es einfacher, Änderungsereignis zu behandeln. – imslavko

+0

Es ist überhaupt nicht kompliziert, den DataContext Ihres Fensters oder Benutzersteuerelements auf eine ViewModel-Klasse zu setzen und in dieser Klasse eine Eigenschaft zu definieren, wie oben dargestellt. Wenn Sie nicht mit einem MVVM-Framework arbeiten möchten, ist es am einfachsten, die INotifyPropertyChanged-Schnittstelle für diese Klasse zu implementieren, damit Ihr Steuerelement über Änderungen an der Eigenschaft benachrichtigt wird. Es ist wirklich nicht so viel Code ... –

5
<CheckBox x:Name="chbRemember1" IsChecked="{Binding Path=RememberUser, Mode=TwoWay}"/> 

 

public class SessionData : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string info) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
    } 


    bool _rememberUser; 
    public bool RememberUser 
    { 
     get 
     { 
      return _rememberUser; 
     } 
     set 
     { 
      _rememberUser = value; 
      NotifyPropertyChanged("RememberUser"); 
     } 
    } 
} 
3

wie diese versuchen, beachten Sie, dass die Eigenschaft nicht statisch ist, sondern das dahinter liegende Feld ist:

public class SessionData : INotifyPropertyChanged 
{ 
    private static bool _rememberUser; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public bool RememberUser 
    { 
     get { return _rememberUser; } 
     set 
     { 
      _rememberUser = value; 
      OnPropertyChanged(); 
     } 
    } 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
this.DataContext = new SessionData(); 
<CheckBox x:Name="chbRemember1" IsChecked="{Binding RememberUser, Mode=TwoWay}"/> 
3

Sie können keine Bindung an statische Eigenschaften herstellen, da statische Eigenschaften das PropertyChanged-Ereignis nicht auslösen können. Sie benötigen natürlich INotifyPropertyChanged. Aber das ist bei statischen Eigenschaften nicht relevant. Sie können einfach nicht an statische Eigenschaften binden. (Sie können in WPF und Silverlight)

Verwandte Themen