WPF自定义ContentControl按Enum值设置背景色失效问题排查
自定义ContentControl背景色不更新?问题出在绑定和触发器类型上!
嘿,我瞅了你的代码,马上就发现问题所在了:你用的DataTrigger绑定{Binding OrderState},但这个绑定默认是在当前DataContext里找这个属性,可你的OrderState是自定义控件BorderWithState自己的依赖属性,不是DataContext里对象的属性啊!这就导致触发器根本没触发,背景色自然一直是默认的灰色。
给你两种简单的修复方案,选哪个都行:
方案1:改用Trigger(更推荐,更简洁)
既然OrderState是控件自身的依赖属性,直接用Trigger就好,它可以直接监听控件的属性变化,不需要绑定:
<ControlTemplate.Triggers> <!-- 其实默认已经是LightGray了,这个Idle的Trigger可以省略,只保留Busy的就行 --> <Trigger Property="OrderState" Value="{x:Static local:OrderSourceState.Busy}"> <Setter TargetName="border" Property="Background" Value="LightGreen"/> </Trigger> </ControlTemplate.Triggers>
这样写不仅代码更短,性能也更好,因为Trigger是专门针对控件依赖属性的触发器。
方案2:修正DataTrigger的绑定(如果一定要用DataTrigger)
要是你坚持用DataTrigger,就得调整绑定路径,让它指向控件自身的OrderState属性,用RelativeSource=TemplatedParent来指定模板对应的控件:
<ControlTemplate.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=OrderState}" Value="{x:Static local:OrderSourceState.Idle}"> <Setter TargetName="border" Property="Background" Value="LightGray"/> </DataTrigger> <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=OrderState}" Value="{x:Static local:OrderSourceState.Busy}"> <Setter TargetName="border" Property="Background" Value="LightGreen"/> </DataTrigger> </ControlTemplate.Triggers>
额外检查点
别忘了确认你的ResourceDictionary已经被正确加载到应用里了!比如在App.xaml里添加引用:
<Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <!-- 替换成你的ResourceDictionary的实际路径 --> <ResourceDictionary Source="YourFolder/BorderWithStateStyle.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources>
这样修改后,当你设置OrderState="{x:Static local:OrderSourceState.Busy}"时,背景色就会变成浅绿色啦!
内容的提问来源于stack exchange,提问作者backer
相关产品推荐
相关产品推荐

