【问题标题】:Checked status not updated in CheckBox templateCheckBox 模板中的已检查状态未更新
【发布时间】:2010-06-13 10:51:16
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    另外,听起来您只是在使用 CheckBox,因为您想要一个基于布尔属性的触发器。您可以使用 DataTrigger 而不是 Trigger 来绑定到 DataContext 上的属性而不是控件上的属性,或者您可以直接将 Text 属性绑定到 SomeBool 并使用将 true 和 false 转换为 "已选中”和“未选中”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多