Используйте триггер свойства, чтобы изменить свойство, которое уже имеет привязку - PullRequest
3 голосов
/ 22 июня 2009

Как я могу использовать триггер свойства в стиле (или другом методе) для изменения свойства (например, всплывающей подсказки), значение которого уже определено привязкой?

У меня есть простая кнопка вроде:

<Button Name="Button1" Style="{StaticResource ButtonStyle}" 
        ToolTip="{Binding Name}" >My Button</Button>

Он имеет привязку к всплывающей подсказке, чтобы показать свойство Name класса, установленного как DataContext.

Моя проблема в том, что я хочу показать имя, когда кнопка включена, и что-то еще, когда она отключена. Я думал, что смогу обойти мою проблему с помощью стиля и триггера, например:

<Style TargetType="Button" x:Key="ButtonStyle">
    <Setter Property="ToolTipService.ShowOnDisabled" Value="True" />
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="ToolTip" Value="Disabled" />
        </Trigger>
    </Style.Triggers>
</Style>

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

Я мог бы обойти это, добавив еще один триггер, например:

<Trigger Property="IsEnabled" Value="true">
    <Setter Property="ToolTip" Value="{Binding Name}" />
</Trigger>

Но я бы хотел использовать стиль для 4 или 5 кнопок, которые будут иметь разные привязки для включенной всплывающей подсказки, но ту же (фиксированную) подсказку, когда они отключены.

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 22 июня 2009

Самое простое решение вашей проблемы - создать стиль кнопки, который могут использовать все ваши кнопки (_DisabledButtonToolTipStyle в примере ниже), а затем определить уникальный стиль для каждой кнопки, который применяет значение всплывающей подсказки. Если отдельные кнопки всегда имеют разные значения всплывающей подсказки, я бы рекомендовал просто встраивать стиль, как показано ниже; однако, если вы хотите повторно использовать включенный стиль подсказки, вы можете легко определить его в своих ресурсах и дать ему ключ.

<Window.Resources>
    <Style x:Key="_DisabledButtonToolTipStyle" TargetType="Button">
        <Setter Property="ToolTipService.ShowOnDisabled" Value="True" />
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="ToolTip" Value="Disabled" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<Grid>
    <Button Name="Button1" Content="My Button">
        <Button.Style>
            <Style TargetType="Button" BasedOn="{StaticResource _DisabledButtonToolTipStyle}">
                <Setter Property="ToolTip" Value="{Binding Name}" />
            </Style>
        </Button.Style>
    </Button>
</Grid>
2 голосов
/ 22 июня 2009

Ваша проблема не имеет ничего общего с привязкой, проблема в том, что свойства, которые вы устанавливаете непосредственно для элемента, переопределяют свойства, установленные в стиле, например:

учитывая стиль

<Style TargetType="Button">
    <Setter Property="Background" Value="Blue"/>
</Style>

И эти две кнопки:

<Button Content="1st"/>
<Button Content="2nd" Background="Red"/>

Первая кнопка получает свой фон от стиля, но вторая переопределяет фон стиля.

Вы можете получить то, что вы хотите, с помощью триггеров, но не используя стили, вы можете использовать DataTemplate, как это (TextBox и CheckBox для тестирования):

<ContentPresenter Content="{Binding}">
    <ContentPresenter.ContentTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBox Name="edt" Text="Tooltip text"/>
                <Button Name="btn" Content="x" 
                    ToolTip="{Binding ElementName=edt, Path=Text}" 
                    ToolTipService.ShowOnDisabled="True"/>
                <CheckBox Content="Enabled" 
                    IsChecked="{Binding ElementName=btn, Path=IsEnabled}"/>
            </StackPanel>
            <DataTemplate.Triggers>
                <Trigger SourceName="btn" Property="IsEnabled" Value="False">
                    <Setter TargetName="btn" Property="ToolTip" Value="Disabled"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ContentPresenter.ContentTemplate>
</ContentPresenter>
...