WPF中PieSeries绑定CheckBox报错排查(LiveCharts C#)
嘿,我懂你遇到的困扰了——当勾选CheckBox时,TextBlock的样式能正常更新,但PieSeries的StrokeThickness就是绑定失败,提示"Cannot find source for binding with reference"对吧?
问题根源
你的PieSeries是放在PieChart.Series集合里的,它的视觉树层级和CheckBox是平级关系(都在同一个Grid下)。但你用了RelativeSource AncestorType={x:Type CheckBox}来绑定,这是在找PieSeries的祖先元素里有没有CheckBox,可CheckBox根本不是它的祖先,绑定自然找不到目标,所以报错了。
修复方案
我们可以用ElementName直接绑定到CheckBox的命名(cbSample),因为同一Window下的元素可以通过ElementName互相访问。修改PieSeries的DataTrigger绑定即可:
原来错误的绑定代码:
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}, Path=IsChecked}" Value="True">
替换为:
<DataTrigger Binding="{Binding ElementName=cbSample, Path=IsChecked}" Value="True">
修改后的完整PieSeries代码片段:
<lvc:PieSeries Values="1" Fill="Black" StrokeThickness="0"> <lvc:PieSeries.Style> <Style TargetType="lvc:PieSeries"> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=cbSample, Path=IsChecked}" Value="True"> <Setter Property="StrokeThickness" Value="10"/> </DataTrigger> </Style.Triggers> </Style> </lvc:PieSeries.Style> </lvc:PieSeries>
备选方案(更稳妥的层级绑定)
如果ElementName绑定偶尔因为可视化树的问题失效(比如PieSeries的加载时机),你可以通过Window的命名(UC)来间接访问CheckBox:
<DataTrigger Binding="{Binding ElementName=UC, Path=cbSample.IsChecked}" Value="True">
额外建议
如果后续你的程序需要更多控件联动,推荐用MVVM模式:把CheckBox的IsChecked绑定到ViewModel的一个布尔属性,然后PieSeries的StrokeThickness通过转换器绑定到这个属性,这样控件之间完全解耦,维护起来更方便。
内容的提问来源于stack exchange,提问作者styx

