You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已为IsChecked赋值,代码仍报DependencyProperty.UnsetValue无效?

问题分析:WPF自定义ToggleButton添加触发器时的InvalidOperationException异常

问题描述

给继承自ToggleButton的自定义WPF控件编程添加样式触发器,已明确将IsChecked设为true,但仍抛出InvalidOperationException,异常信息为:

'{DependencyProperty.UnsetValue}' is not a valid value for property 'IsChecked'

调用ReadLocalValue(IsCheckedProperty)和GetValue(IsCheckedProperty)均返回设置的true值,却依然报错。

代码片段

protected BalanceSheetButton(OperationSummaryModel summaryModel, OperationFlow operationFlow, 
StackPanel mainPanel)
{
    this.IsChecked = true;
    RegisterStyle();
}

private void RegisterStyle()
{
    var a = ((DependencyObject)this).ReadLocalValue(IsCheckedProperty);
    var style = new Style();

    var trigger = new Trigger();
    trigger.Property = IsCheckedProperty;
    trigger.Setters.Add(new Setter { Property = ForegroundProperty, Value = this.Foreground });
    style.Triggers.Add(trigger);
    Style = style;
}

原因分析

问题核心在于你创建的Trigger未指定Value属性。WPF属性触发器默认会尝试匹配DependencyProperty.UnsetValue,但IsChecked是bool?类型,UnsetValue并非该属性的合法取值,因此触发了异常。

虽然你已经给控件实例的IsChecked赋值为true,但触发器本身并不知道要监听这个值,必须显式指定匹配的目标值,否则WPF会默认使用非法的UnsetValue进行匹配。

解决方案

修改RegisterStyle方法,为Trigger添加Value赋值,明确指定要匹配的IsChecked值:

private void RegisterStyle()
{
    var style = new Style();

    var trigger = new Trigger();
    trigger.Property = IsCheckedProperty;
    trigger.Value = true; // 关键:指定触发器匹配的属性值
    trigger.Setters.Add(new Setter { Property = ForegroundProperty, Value = this.Foreground });
    style.Triggers.Add(trigger);
    Style = style;
}

如果需要针对IsChecked为false的场景设置样式,可再添加一个对应Trigger,同样指定Value = false即可。

内容的提问来源于stack exchange,提问作者SuperMenthol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:35:04