2009-06-21 6 views
3

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

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

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

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

Любые предложения?

ответ

3

Самое легкое решение вашей проблемы - создать стиль кнопки, который все ваши кнопки могут использовать (_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

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

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

<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> 
Смежные вопросы