Проверенный статус не обновляется в шаблоне CheckBox - PullRequest
1 голос
/ 13 июня 2010

Я пытаюсь создать гиперссылку, которая меняет свой текст в зависимости от логического значения. Я думал, что мог бы использовать метод 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>

Но когда я нажимаю на гиперссылку, ничего не происходит. Проверенный статус не изменяется, а свойство Text для TextBlock не обновляется. Есть идеи?

1 Ответ

5 голосов
/ 14 июня 2010

Добавляя текст в элемент TextBlock в качестве содержимого, вы устанавливаете локальное значение в свойстве Text. Локальные значения переопределяют значения, установленные триггерами, поэтому ваш триггер не будет иметь никакого эффекта. См. этот вопрос StackOverflow или Значение свойства зависимости Приоритет для msdn.

Если вы установите свойство Text вместо добавления его в качестве содержимого, оно будет считаться набором свойств родительского шаблона и будет иметь более низкий приоритет, чем триггер родительского шаблона:

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

Кроме того, похоже, что вы используете только CheckBox, потому что вы хотите триггер, основанный на логическом свойстве. Вы можете использовать DataTrigger вместо Trigger для привязки к свойству DataContext вместо свойства в вашем элементе управления, или вы можете просто привязать свойство Text напрямую к SomeBool и использовать преобразователь значения, который преобразует true и false для «Проверено» и «Не проверено».

...