如何每次触发事件 CheckBox.IsChecked 被分配了一个值
本文关键字:一个 分配 何每次 事件 IsChecked CheckBox | 更新日期: 2023-09-27 18:36:35
我面临以下问题:对于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
上的IsChecked属性是一个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;
}
如果数据绑定到属性 IsChecked,它将在每次更改绑定目标时设置绑定目标上的值
在单击时覆盖 ;在您的班级中打开已检查和打开未选中的事件并引发您的新事件;
我在项目中使用了如下所示的复选框
<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...
}
}