检查状态未在CheckBox模板中更新

时间:2010-06-13 10:51:17

标签: c# .net wpf checkbox control-template

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

1 个答案:

答案 0 :(得分:5)

通过在TextBlock元素中添加文本作为内容,您将在Text属性上设置本地值。本地值覆盖触发器设置的值,因此您的触发器将不起作用。请参阅msdn上的this StackOverflow questionDependency Property Value Precedence

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

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

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