1

私は次の問題に直面しています: チェックボックスの状態を変更しようとしたときに、WPF のチェックボックスについて知る必要があります。

  • チェックボックスがユーザーによってクリックされた場合 - イベントを発生させます。
  • チェックボックスの IsChecked プロパティに新しい値が指定された場合 - イベントを発生させます。
  • チェックボックスの IsChecked プロパティに既にある値と同じ値が指定された場合 - イベントを発生させます。

この構造は、組み込みデバイスを制御するソフトウェアで使用されます。このデバイスの状態を要求することはできません。デバイスに特定の状態に入るように指示することのみが可能です。デバイスが特定の状態にある場合、この状態に入るようにデバイスに再度指示しても害はありません。したがって、私の要求。

これまでのところ、私は次の解決策を考え出しました: CheckBox から派生する新しいクラスを作成しますが、IsChecked プロパティを次のように再定義します。

public class ExtendedCheckBox : CheckBox
{
    public class IsCheckedAssignedEventArgs : RoutedEventArgs
    {
        public bool? prevState { get; set; }
        public bool? newState { get; set; }
        public IsCheckedAssignedEventArgs(bool? prevState, bool? newState)
        {
            this.prevState = prevState;
            this.newState = newState;
        }
    }

    public event EventHandler IsCheckedAssigned = delegate { };

    public new bool? IsChecked
    {
        get
        {
            return base.IsChecked;
        }

        set
        {
            this.IsCheckedAssigned(this, new IsCheckedAssignedEventArgs(this.IsChecked, value));
            base.IsChecked = value;
        }
    }
}

IsChecked プロパティがプログラムによって割り当てられている場合にのみ、適切に機能します。CheckBox がクリックされた場合、イベントは発生しません。

最初の質問は、これは私の問題に対する正しいアプローチですか? はいの場合、必要なすべてのケースで機能させるにはどうすればよいですか? いいえの場合、より良いアプローチは何ですか?

アイデアをお寄せいただきありがとうございます。

4

4 に答える 4

2

の IsChecked プロパティCheckBoxは ですDependancyProperty。その上に新しいラッパーを作成するだけでは、UI を介して更新されません。これは、WPF エンジンがGetValue() およびSetValue() を呼び出して、プロパティ ラッパーではなくその値を取得および設定するためです。

IsChecked が変更されたかどうかだけを知りたい場合は、クラスに以下のコードを追加して、IsCheckedProperty のプロパティメタデータをオーバーライドできます。

    static ExtendedCheckBox ()
    {
        IsCheckedProperty.OverrideMetadata(typeof(ExtendedCheckBox ), new FrameworkPropertyMetadata(null , new CoerceValueCallback(IsCheckedCoerced)));
    }

    private static object IsCheckedCoerced(DependencyObject obj, object value)
    {
        var myCheckBox = obj as ExtendedCheckBox ;

        if (myCheckBox != null)
        {
            myCheckBox.IsCheckedAssigned(myCheckBox, new IsCheckedAssignedEventArgs(myCheckBox.IsChecked, (bool)value));
        }
        return value;
    }
于 2013-10-23T09:46:24.490 に答える
1

プロパティ IsChecked にデータバインドすると、値が変更されるたびにバインドターゲットに値が設定されます

于 2013-10-23T09:46:08.150 に答える
0

プロジェクトで以下のようなチェックボックスを使用しています

<CheckBox Name="chkExist" Grid.Column="1" Grid.Row="0" Content="Existing settings" VerticalAlignment="Center" IsChecked="{Binding IsExistingSetting, Mode=TwoWay}"></CheckBox>

bool isExistingSetting;

public bool IsExistingSetting
{
  get { return isExistingSetting; }
  set
  {
    if (value != isExistingSetting)
    {
     //calling one method as per my business. Method(value);
      isExistingSetting= value;
      OnPropertyChanged("IsChecked");
     }
    }
 }
 private void Method(bool isValue)
 {
  if(isValue)
  {
    // do something...
  }
  else
  {
   // do something...
  }
}
于 2013-10-23T10:03:15.017 に答える
0

OnClick をオーバーライドします。クラスの OnChecked および OnUnchecked イベントと新しいイベントを発生させます。

于 2013-10-23T10:06:41.483 に答える