2010-06-13 83 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」和「未選中」。