2013-03-18 11 views
25

Nell'associazione dati WPF, è possibile associare la proprietà IsChecked ad alcuni dati, ad es. impostazione utente, ma ho bisogno di gestire l'evento "CheckChanged", so che posso gestire separatamente Controllato, non registrato evento, ma c'è un modo per essere avvisato quando il valore viene modificato?WPF Casella di controllo: controllare la gestione modificata

<CheckBox Content="Case Sensitive" IsChecked="{Binding bSearchCaseSensitive, 
      Source={x:Static Properties:Settings.Default}}" /> 

Nota: non mi interessa se è selezionato o deselezionato. Voglio solo essere avvisato quando è cambiato.

+1

Che cosa vuoi? perché non leghi la proprietà 'IsChecked' a qualcosa nel ViewModel e reagisci a quella proprietà? L'interfaccia utente non è dati. –

+0

È già associato alle impostazioni dell'utente. L'interfaccia utente non è dati, è correlata alla domanda sollevata? – David

+2

Il mio punto è che se il ViewModel deve essere consapevole delle modifiche, dovresti associarlo al ViewModel e non a una cosa statica, quindi all'interno della VM potresti cambiare il valore statico. –

risposta

0

E l'evento Checked? Combinalo con AttachedCommandBehaviors o qualcosa di simile e un DelegateCommand per attivare una funzione nel tuo viewmodel ogni volta che viene chiamato quell'evento.

+0

Come commentato nella domanda, non voglio usare Controllato/Event handler non controllato, ciò che mi importa è il segnale "cambiato". – David

8

Im mettere questo in una risposta perché è troppo lungo per un commento:

Se è necessario la VM di essere a conoscenza quando il CheckBox viene modificato, si dovrebbe davvero associare il CheckBox al VM, e non una statica valore:

public class ViewModel 
{ 
    private bool _caseSensitive; 
    public bool CaseSensitive 
    { 
     get { return _caseSensitive; } 
     set 
     { 
      _caseSensitive = value; 
      NotifyPropertyChange(() => CaseSensitive); 

      Settings.Default.bSearchCaseSensitive = value; 
     } 
    } 
} 

XAML:

<CheckBox Content="Case Sensitive" IsChecked="{Binding CaseSensitive}"/> 
+1

@HighScore, Grazie, questa è una soluzione, ma eccessivo per il mio caso. Non voglio ricorrere a INotifyPropertyChanged, è troppo ingombrante. :) – David

+2

@David Cosa? come stai gestendo il binding bidirezionale WPF senza 'INotifyPropertyChanged'? Inoltre, questo non ha nulla a che fare con l'esempio, è solo lì perché è una proprietà ViewModel. Il mio esempio funziona bene se lo rimuovi. –

+1

È vero, questo è bidirezionale. l'impostazione può essere sia letta sia scritta, con un peccato che non mi venga notificata la modifica del setter. – David

61

che si possibile h andle gli eventi selezionati e deselezionati separatamente non significa che tu abbia per. Se non si vuole seguire il modello MVVM è sufficiente collegare lo stesso gestore per entrambi gli eventi e hai il tuo segnale di cambio:

<CheckBox Checked="CheckBoxChanged" Unchecked="CheckBoxChanged"/> 

e nel Codice-dietro;

private void CheckBoxChanged(object sender, RoutedEventArgs e) 
{ 
    MessageBox.Show("Eureka, it changed!"); 
} 

prega di notare che WPF incoraggia fortemente il modello MVVM utilizzando INotifyPropertyChanged e/o DependencyProperties per un motivo. Questo è qualcosa che funziona, non qualcosa che vorrei incoraggiare come buona abitudine di programmazione.

4

So che questa è una vecchia domanda, ma che ne dici di limitarsi a Command se si utilizza MVVM?

es:

<CheckBox Content="Case Sensitive" Command="{Binding bSearchCaseSensitive}"/> 

Per me è attiva su entrambi Check e Uncheck.

5

Come una casella di controllo click = una casella di controllo modificare la seguente sarà anche lavorare:

<CheckBox Click="CheckboxClicked" /> 
Private Sub CheckboxClicked(sender As Object, e As System.Windows.RoutedEventArgs) 
    '.... do some stuff 
End Sub 

Ha il vantaggio di lavorare quando IsThreeState = "True", mentre solo manipolazione Controllato e Non selezionato no.

+0

Cosa succede se la casella di controllo è disabilitata ma si fa clic? Immagino che l'evento scoppi ancora, che non è il comportamento desiderato, il più delle volte –

+0

Questo non dovrebbe accadere. Se è disabilitato, anche l'evento click sarà disabilitato. – Expenzor

Problemi correlati