已为IsChecked赋值,代码仍报DependencyProperty.UnsetValue无效?
问题描述
给继承自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
相关产品推荐
相关产品推荐

