2012-12-05 22 views
7

Ho la casella di controllo nella mia applicazione XAML + C# Windows Store. Inoltre ho proprietà bool: WindowsStoreTestApp.SessionData.RememberUser che è pubblico e statico.XAML Collegamento alla proprietà

Desidero che la proprietà della casella di controllo IsChecked sia coerente (o associata o mappata) a questa proprietà bool.

ho provato questo: XAML

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

C#

chbRemember1.DataContext = SessionData.RememberUser; 

Codice per la proprietà:

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

Ma non sembra funzionare. Mi potete aiutare?

+0

Puoi chiarire cosa non funziona a riguardo? È un aggiornamento a due vie che non funziona? Non funziona affatto? Inoltre, puoi mostrare il codice per SessionData (in particolare RememberUser)? Questo ci aiuterà a diagnosticare il problema. –

+0

Ogni volta che uno di questi cambia, anche il secondo dovrebbe cambiare. – imslavko

+0

Qualunque sia la mia modifica, la mappatura non funziona. Ho provato a modificare la proprietà nel codice, la casella di controllo non ha controllato. Provato di fronte, checkbox selezionato, poi visualizzato nel debugger, la proprietà non è cambiata – imslavko

risposta

3

È necessario implementare una forma di notifica di modifica affinché la casella di controllo sia "a conoscenza" di eventuali modifiche alla proprietà. La soluzione migliore è utilizzare uno dei molti framework MVVM disponibili, se non lo è, implementare INotifyPropertyChanged nel ViewModel.

Inoltre, tipicamente in WPF, noi non impostare il DataContext dei singoli controlli, ma impostare il DataContext della finestra o di controllo utente a un ViewModel ...

Ecco un esempio di una proprietà con notifica di modifica attraverso uno dei quadri MVVM:

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

Come si può vedere una semplice proprietà auto-implementato non può essere utilizzato per l'associazione dati in WPF ...

mi consiglia di passare attraverso Data Binding Overview sopra su MSDN ..

+0

Grazie per la risposta. C'è un modo semplice per legare una sola proprietà? Non voglio generare tonnellate di codice solo per una proprietà, quindi è più semplice gestire l'evento di modifica. – imslavko

+0

Non è affatto complicato impostare DataContext della finestra o controllo utente su una classe ViewModel e in quella classe definire una proprietà come illustrato sopra. Se preferisci non lavorare con un framework MVVM, è più semplice implementare l'interfaccia INotifyPropertyChanged su quella classe in modo che il tuo controllo venga informato di eventuali modifiche alla proprietà. Dopo tutto, non è poi così tanto codice ... –

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

Prova come questo, si noti che la proprietà non è statico, ma il campo supporto è:

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

Non è possibile eseguire il binding a proprietà statiche poiché le proprietà statiche non possono generare l'evento PropertyChanged. Ovviamente avrai bisogno di INotifyPropertyChanged. Ma questo non è rilevante con le proprietà statiche. Semplicemente non puoi legare a proprietà statiche. (È possibile in WPF e Silverlight)

Problemi correlati