2013-03-18 10 views
25

In WPF-Datenbindung kann ich die IsChecked-Eigenschaft an einige Daten binden, z. Benutzereinstellung, aber ich brauche „CheckChanged“ Ereignis zu behandeln, ich weiß, ich seperat Karo verarbeiten kann, Ungeprüfter Ereignis, aber ist es eine Möglichkeit, informiert werden, wenn dieser Wert geändert wird?WPF-Kontrollkästchen: Überprüfen Sie die geänderte Behandlung

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

Hinweis: Mir ist es egal, ob es aktiviert oder deaktiviert wird. Ich möchte nur benachrichtigt werden, wenn es geändert wird.

+1

Wofür wollen Sie das? Warum binden Sie die 'IsChecked'-Eigenschaft nicht an etwas im ViewModel und reagieren auf diese Eigenschaft? UI ist nicht Daten. –

+0

Es ist bereits an Benutzereinstellungen gebunden. UI sind keine Daten, hängt das mit der Frage zusammen? – David

+2

Mein Punkt ist, dass, wenn das ViewModel beachten muss, wenn sich das ändert, Sie das wirklich an das ViewModel und nicht an eine statische Sache binden sollten, dann könnten Sie innerhalb der VM den statischen Wert ändern. –

Antwort

0

Was ist mit dem Checked Ereignis? Kombinieren Sie das mit AttachedCommandBehaviors oder etwas ähnliches, und eine DelegateCommand, um eine Funktion in Ihrem Viewmodel abgefeuert zu bekommen, immer wenn dieses Ereignis aufgerufen wird.

+0

Wie in der Frage kommentiert, möchte ich Checked nicht verwenden/Ungeprüfter Event-Handler, was mich interessiert, ist das "veränderte" Signal. – David

8

Im setzen dieses in einer Antwort, weil es für einen Kommentar zu lang ist:

Wenn Sie die VM müssen sich bewusst sein, wenn die CheckBox geändert wird, sollten Sie wirklich die CheckBox an die VM binden und kein statisches Wert:

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, Danke, das ist eine Lösung, aber Overkill für meinen Fall. Ich möchte nicht auf INotifyPropertyChanged zurückgreifen, es ist zu umständlich. :) – David

+2

@David Was? Wie gehen Sie mit WPF-Zweiwege-Bindung ohne "INotifyPropertyChanged" um? Außerdem hat das nichts mit dem Beispiel zu tun, es ist nur da, weil es eine ViewModel-Eigenschaft ist. Mein Beispiel funktioniert gut, wenn Sie das entfernen. –

+1

Es ist wahr, das ist Zwei-Wege-Bindung. Die Einstellung kann sowohl gelesen als auch geschrieben werden, mit einer Schande, dass ich nicht über die Änderung des Setter informiert werde. – David

61

Dass Sie kann h andle die checked und unchecked events separat bedeutet nicht, dass Sie haben. Wenn Sie Sie können nicht das MVVM Muster folgen wollen, einfach den gleichen Handler für beide Ereignisse anhängen und Sie haben Ihre Änderungssignal:

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

und in-Code-behind;

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

Bitte beachten Sie, dass WPF das MVVM Muster unter Verwendung von INotifyPropertyChanged und/oder DependencyProperties aus einem Grund stark fördert. Das ist etwas, das funktioniert, nicht etwas, das ich als gute Programmiergewohnheit fördern möchte.

4

Ich weiß, das ist eine alte Frage, aber wie wäre es nur mit Command binden, wenn MVVM verwendet?

ex:

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

Für mich löst es sowohl auf Check und Uncheck.

5

Als Checkbox Klick = eine Checkbox die folgende funktioniert auch ändern:

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

es den zusätzlichen Vorteil hat, wenn IsThreeState = "True" Arbeits während Karo gerade Handhabung und Deaktiviert nicht.

+0

Was passiert, wenn die Checkbox deaktiviert ist, aber Sie darauf klicken? Ich schätze das Ereignis feuert immer noch, was nicht das gewünschte Verhalten ist, meistens –

+0

Das sollte nicht passieren. Wenn es deaktiviert ist, wird das click -Ereignis ebenfalls deaktiviert. – Expenzor