代码之家  ›  专栏  ›  技术社区  ›  Simon

复选框模板中未更新选中状态

  •  1
  • Simon  · 技术社区  · 14 年前

    我正在创建一个超链接,它根据布尔值更改文本。我想我可以利用复选框的ischecked方法。所以我为一个复选框编写了这个控制模板:

     <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 回复  |  直到 14 年前
        1
  •  5
  •   Community omersem    7 年前

    通过在textBlock元素中添加文本作为内容,可以在文本属性上设置本地值。局部值覆盖由触发器设置的值,因此触发器将不起作用。见 this StackOverflow question Dependency Property Value Precedence 在MSDN上。

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

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

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