我正在尝试创建一个超链接,根据布尔值更改其文本。我以为我可以利用CheckBox的IsChecked方法。所以我为CheckBox编写了这个ControlTemplate:
<CheckBox Checked="CheckBox_Checked" IsChecked="{Binding Path=SomeBool, Mode=TwoWay}">
<CheckBox.Template>
<ControlTemplate TargetType="{x:Type CheckBox}">
<BulletDecorator>
<BulletDecorator.Bullet>
<TextBlock>
<Hyperlink>
<TextBlock x:Name="TextBoxHyperlink">Unchecked</TextBlock>
</Hyperlink>
</TextBlock>
</BulletDecorator.Bullet>
<ContentPresenter />
</BulletDecorator>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="TextBoxHyperlink"
Property="Text"
Value="Checked" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</CheckBox.Template>
</CheckBox>
但是当我点击超链接时,没有任何反应。检查的状态不会更改,并且TextBlock的Text属性不会更新。有什么想法吗?
答案 0 :(得分:5)
通过在TextBlock元素中添加文本作为内容,您将在Text属性上设置本地值。本地值覆盖触发器设置的值,因此您的触发器将不起作用。请参阅msdn上的this StackOverflow question或Dependency Property Value Precedence。
如果设置Text属性而不是将其添加为内容,则它将被视为父模板属性集,并且优先级低于父模板触发器:
<TextBlock x:Name="TextBoxHyperlink" Text="Unchecked"/>
此外,听起来您只使用CheckBox,因为您需要基于Boolean属性的触发器。您可以使用DataTrigger而不是触发器绑定到DataContext上的属性而不是控件上的属性,或者您可以直接将Text属性绑定到SomeBool并使用转换true和false的值转换器“检查”和“未选中”。