我是 WPF 新手,我正在执行一些模拟来尝试理解 绑定(bind)
“事物”(例如 {Binding}
、{TemplateBinding}
...)
好的,所以我在这里制作这个示例来测试 TemplateBinding
并且运行良好:
<Button Width="100" Height="100">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Image Source="image.png" Width="{TemplateBinding Width}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
</Button>
现在我尝试了相同的但具有其他属性:
<Button Width="100" Height="100" Content="image.png">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Image Source="{TemplateBinding Content}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
</Button>
在第一种情况下,绑定(bind)完美发生。但第二秒什么也没有发生。
我在这里缺少什么?有一些属性可以绑定(bind)其他属性则不能?
我真的迷失了,有人可以向我解释为什么一个有效而另一个无效吗?
最佳答案
TemplateBinding
在编译时进行评估,并且不提供自动值类型转换(在本例中为 string
到 ImageSource
)。只需使用 TemplatedParent
相对源绑定(bind)即可
<Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" />
与此问题没有直接关系的另一件事是,如果您想将 TemplateBinding
用于相同类型的其他属性,请确保相应地设置 TargetType
。 TemplateBinding
根据 ControlTemplate
类型进行评估,默认 TargetType
为 System.Windows.Controls.Control
<ControlTemplate TargetType="{x:Type Button}">
关于c# - 为什么TemplateBinding无法绑定(bind)Button.Content?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36820440/