2010-06-13 75 views
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属性不会更新。有任何想法吗?

回答

5

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

如果设置了Text属性,而不是将其作为内容的,将被视为一个父模板属性集,并比父模板触发低优先级:

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

而且,这听起来像你”只需使用复选框,因为您需要基于布尔属性的触发器。您可以使用DataTrigger而不是触发器绑定到DataContext上的属性而不是控件上的属性,或者您可以将Text属性直接绑定到SomeBool并使用值转换器将true和false转换为“Checked”和“未选中”。