web-dev-qa-db-ja.com

WPFチェックボックス:変更された処理を確認する

WPFデータバインディングでは、IsCheckedプロパティをいくつかのデータにバインドできます。ユーザー設定ですが、「CheckChanged」イベントを処理する必要があります。個別に処理できることはわかっていますCheckedUncheckedイベントですが、この値が変更されたときに通知を受ける方法はありますか?

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

注:チェックされているかどうかは関係ありません。変更されたときに通知を受け取りたいだけです。

39
David

can確認済みイベントと未確認イベントを別々に処理しても、have toとは限りません。 MVVMパターンに従わない場合は、両方のイベントに同じハンドラーをアタッチするだけで、変更シグナルを受け取ることができます。

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

および分離コード。

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

WPFは、理由のためにINotifyPropertyChangedやDependencyPropertiesを利用するMVVMパターンを強く推奨していることに注意してください。これは機能するものであり、良いプログラミング習慣として奨励したいものではありません。

85
nvoigt

コメントするには長すぎるので、これを答えに入れています:

CheckBoxが変更されたときに注意するためにVMが必要な場合は、静的な値ではなく、実際にCheckBoxをVMにバインドする必要があります。

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

チェックボックスのクリック=チェックボックスの変更として、以下も変更できます:

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

IsThreeState="True"一方、CheckedおよびUncheckedの処理は行いません。

11
Rob

これは古い質問ですが、MVVMを使用している場合にCommandにバインドするのはどうですか?

例:

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

私にとっては、CheckUncheckの両方でトリガーされます。

7
user1568891

MVVMパターンを使用してチェック済み/未チェックのイベントを処理するために見つけたシンプルで適切な方法は、Caliburn.Microを使用した次のとおりです。

 <CheckBox IsChecked="{Binding IsCheckedBooleanProperty}" Content="{DynamicResource DisplayContent}" cal:Message.Attach="[Event Checked] = [Action CheckBoxClicked()]; [Event Unchecked] = [Action CheckBoxClicked()]" />

そして、ViewModelにMethod CheckBoxClicked()を実装して、必要なことを行います。

0
Syph3r-

チェック済み イベントはどうですか?それを AttachedCommandBehaviors または類似のものと組み合わせ、 DelegateCommand を使用して、そのイベントが呼び出されるたびにビューモデルで起動される関数を取得します。

0
dowhilefor