XAML中使用Trigger实现RadioButton选中联动Label显隐时抛出绑定类型异常
错误根因拆解
你遇到的System.InvalidOperationException: 'bindable not an instance of AssociatedType'报错,核心原因是DataTrigger的目标类型配置和触发器所属控件不匹配:
- 触发器集合是挂载在
Label的Label.Triggers节点下的,整个触发器集合的作用对象就是这个Label控件,因此集合内所有DataTrigger的TargetType属性,必须和所属控件的类型保持一致,也就是要写成TargetType="Label"。 - 很多新手写触发器时容易混淆:
TargetType指的是被触发器操作、要应用Setter属性值的控件类型,不是绑定源的控件类型。你看到绑定源是RadioButton就顺手写了TargetType="RadioButton",相当于告知系统这个触发器是为RadioButton控件设计的,但后续Setter要修改的对象是Label的IsVisible属性,系统校验时发现操作的对象不是声明的关联类型(RadioButton)的实例,就直接抛出了对应异常。 - 你配置的绑定源(指向rdbEnglish控件的IsChecked属性)逻辑是完全正确的,不存在问题。
修正后的实现代码
只需要修改DataTrigger的TargetType属性,无需改动其他逻辑,修正后的Label片段如下:
<Label x:Name="lblrdbEnglish" Text="Note : Menu iteam changes will be updated next time" Margin="2,-10,2,5" TextColor="Red" IsVisible="false" FontAttributes="Italic" > <Label.Triggers> <DataTrigger TargetType="Label" Binding="{Binding Source={x:Reference rdbEnglish}, Path=IsChecked}" Value="True" > <Setter Property="IsVisible" Value="True" /> </DataTrigger> </Label.Triggers> </Label>
修改完成后,当rdbEnglish被选中(IsChecked为True)时,对应的Label就会自动显示,完全匹配你预期的选中RadioButton后切换Label显示状态的效果,不需要额外手写INotifyPropertyChanged相关的通知逻辑。
内容的提问来源于stack exchange,提问作者Prashant Sharma
相关产品推荐
相关产品推荐

