1

我正在尝试创建一个根据布尔值更改其文本的超链接。我想我可以利用 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 属性未更新。有任何想法吗?

4

1 回答 1

5

通过在 TextBlock 元素中添加文本作为内容,您将在 Text 属性上设置一个本地值。本地值会覆盖触发器设置的值,因此您的触发器将无效。请参阅此 StackOverflow 问题或msdn 上的Dependency Property Value Precedence

如果您设置 Text 属性而不是将其添加为内容,它将被视为父模板属性集,并且优先级低于父模板触发器:

<TextBlock x:Name="TextBoxHyperlink" Text="Unchecked"/>

此外,听起来您只是在使用 CheckBox,因为您想要一个基于布尔属性的触发器。您可以使用DataTrigger而不是 Trigger 来绑定到 DataContext 上的属性而不是控件上的属性,或者您可以直接将 Text 属性绑定到 SomeBool 并使用将 true 和 false 转换为“Checked”的值转换器和“未选中”。

于 2010-06-14T00:50:18.567 回答