web-dev-qa-db-fra.com

Case à cocher WPF: Vérifier la manipulation modifiée

Dans la liaison de données WPF, je peux lier la propriété IsChecked à certaines données, par exemple. paramètre utilisateur, mais je dois gérer un événement "CheckChanged", je sais que je peux gérer séparémentChecked,Uncheckedevent, mais existe-t-il un moyen de recevoir une notification lorsque cela la valeur est changée?

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

Note: Peu m'importe si c'est coché ou décoché. Je veux juste être averti quand il est changé.

35
David

Que vous puissiez gérer les événements cochés et non cochés séparément ne signifie pas que vous devez . Si vous ne voulez pas suivre le modèle MVVM, vous pouvez simplement attacher le même gestionnaire aux deux événements et vous avez votre signal de changement:

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

et dans Code-behind;

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

Veuillez noter que WPF encourage vivement le modèle MVVM utilisant INotifyPropertyChanged et/ou DependencyProperties pour une raison. C’est quelque chose qui fonctionne et non pas quelque chose que je voudrais encourager comme bonne habitude de programmation.

76
nvoigt

Je mets cela dans une réponse parce que c'est trop long pour un commentaire:

Si vous avez besoin que la VM sache que la CheckBox est modifiée, vous devez lier la CheckBox à la VM, et non une valeur statique:

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}"/>
12

En tant que case à cocher, cliquez sur = une case à cocher, les éléments suivants fonctionneront également:

<CheckBox Click="CheckBox_Click" />
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
    // ... do some stuff
}

Cela présente l’avantage supplémentaire de fonctionner lorsque IsThreeState="True" alors que le simple fait de manipuler les cases Coché et Décoché ne le fait pas.

9
Rob

Je sais que c'est une vieille question, mais pourquoi ne pas simplement relier Command si vous utilisez MVVM?

ex:

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

Pour moi, cela déclenche à la fois Check et Uncheck.

4
user1568891

Qu'en est-il du Checked event? Combinez cela avec AttachedCommandBehaviors ou quelque chose de similaire, et un DelegateCommand pour obtenir une fonction activée dans votre modèle de vue chaque fois que cet événement est appelé.

0
dowhilefor