WPF中ProgressBar样式与DataTrigger绑定异常问题咨询
问题拆解与修复方案
嘿,你的第二种XAML写法失效的核心原因是绑定上下文错误,具体逻辑是这样的:
第一种可行的Style里,
DataTrigger定义在ProgressBar的Style中,此时绑定的上下文是ProgressBar的DataContext(也就是你的ViewModel),所以{Binding Path=IsChecked}能精准定位到ViewModel里的IsChecked属性,触发器自然正常工作。但第二种写法把
DataTrigger放到了ControlTemplate内部的Rectangle的Style里。这时候Rectangle的默认DataContext是模板对应的控件本身——也就是ProgressBar,而不是你的ViewModel。当你写{Binding Path=IsChecked}时,WPF会去搜ProgressBar有没有IsChecked属性,可ProgressBar根本没这个属性啊!绑定直接失效,触发器当然起不了作用。
两种修复方法
只需要调整Rectangle里的绑定路径,让它正确指向ViewModel的IsChecked就行,推荐两种常用方式:
方法1:用RelativeSource向上找ProgressBar的DataContext
修改Rectangle Style中的DataTrigger绑定:
<Style TargetType="Rectangle"> <Style.Triggers> <DataTrigger Value="True" Binding="{Binding Path=DataContext.IsChecked, RelativeSource={RelativeSource AncestorType=ProgressBar}}"> <Setter Property="Fill" Value="Red"/> </DataTrigger> <DataTrigger Value="False" Binding="{Binding Path=DataContext.IsChecked, RelativeSource={RelativeSource AncestorType=ProgressBar}}"> <Setter Property="Fill" Value="Yellow"/> </DataTrigger> </Style.Triggers> </Style>
方法2:用ElementName绑定(如果ProgressBar有命名)
要是你的ProgressBar在XAML里有命名,比如x:Name="MyProgressBar",也可以这么写:
<Style TargetType="Rectangle"> <Style.Triggers> <DataTrigger Value="True" Binding="{Binding Path=DataContext.IsChecked, ElementName=MyProgressBar}"> <Setter Property="Fill" Value="Red"/> </DataTrigger> <DataTrigger Value="False" Binding="{Binding Path=DataContext.IsChecked, ElementName=MyProgressBar}"> <Setter Property="Fill" Value="Yellow"/> </DataTrigger> </Style.Triggers> </Style>
这样调整后,Rectangle就能正确找到ViewModel里的IsChecked属性,触发器就会正常工作啦。
内容的提问来源于stack exchange,提问作者Daniele Sartori
相关产品推荐
相关产品推荐

