WPF样式中绑定自定义IsPlaying依赖属性报错问题
问题产生原因
- 直接触发报错的核心原因是
TemplateBinding标记扩展的用法错误:TemplateBinding是WPF针对控件模板场景设计的轻量绑定实现,它本身不支持配置Converter、ConverterParameter这类标准Binding的扩展属性。你写的{TemplateBinding IsPlaying, Converter={c:InverseBoolToVisibilityConverter}}语法不符合解析规则,XAML解析器会把逗号后的Converter配置错误识别为属性路径的一部分,最终尝试查找名为IsPlaying.的不存在的依赖属性,抛出对应的解析错误。 - 次要隐患:你的
ControlTemplate没有声明TargetType,虽然部分场景下可以继承父Style的目标类型,但缺失该声明容易引发模板内绑定、触发器的解析异常。
修复方法
把模板内带Converter的TemplateBinding替换为指定RelativeSource={RelativeSource TemplatedParent}的标准Binding写法,同时给ControlTemplate补全TargetType声明即可,业务层的控件使用代码不需要做任何修改。
修复后的完整样式代码如下:
<Style TargetType="c:PlayPauseButton"> <Setter Property="IsPlaying" Value="False"/> <Setter Property="Template"> <Setter.Value> <!-- 补全ControlTemplate的目标类型 --> <ControlTemplate TargetType="{x:Type c:PlayPauseButton}"> <Grid> <!-- 替换为支持Converter配置的标准模板绑定写法 --> <Image Width="100" Height="100" Visibility="{Binding IsPlaying, RelativeSource={RelativeSource TemplatedParent}, Converter={c:InverseBoolToVisibilityConverter}}"> ... </Image> <Image Width="100" Height="100" Visibility="{Binding IsPlaying, RelativeSource={RelativeSource TemplatedParent}, Converter={c:BoolToVisibilityConverter}}"> ... </Image> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>
补充说明:这种标准TemplatedParent绑定的写法和
TemplateBinding的绑定效果完全一致,支持双向绑定、属性变更通知,性能差异可以忽略,是WPF中模板绑定需要配置转换器时的标准实现方案。
内容的提问来源于stack exchange,提问作者Валентин Никин
相关产品推荐
相关产品推荐

