2010-06-13 3 views
1

부울 값에 따라 텍스트가 변경되는 하이퍼 링크를 만들려고합니다. CheckBox의 IsChecked 메서드를 활용할 수 있다고 생각했습니다. 그래서 CheckBox에 대해이 ControlTemplate을 작성했습니다.CheckBox 템플릿에서 상태 확인이 업데이트되지 않았습니다.

<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 question 또는 Dependency Property Value Precedence을 참조하십시오. 콘텐츠로 추가하는 대신 텍스트의 속성을 설정하면

, 그것은 부모 템플릿 속성 집합으로 간주하고 부모 템플릿의 트리거보다 낮은 우선 순위가 될 것이다 : 또한

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

, 그것은 당신 같은 소리 부울 속성을 기반으로하는 트리거를 원하므로 CheckBox 만 사용해야합니다. 트리거 대신 DataTrigger을 사용하여 컨트롤의 속성 대신 DataContext의 속성에 바인딩하거나 Text 속성을 SomeBool에 직접 바인딩하고 true 및 false를 "Checked"로 변환하는 값 변환기를 사용할 수 있습니다. 및 "선택 취소".

관련 문제