Вопрос о стилях и подсказках WPF - PullRequest
2 голосов
/ 02 декабря 2010

У меня есть стиль, который я использую для создания динамических всплывающих подсказок в определенных текстовых полях, например, так.

<Style TargetType="{x:Type TextBox}">
  <Setter Property="MinWidth" Value="100"/>
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="True">

      <!-- item of interest -->
      <Setter Property="ToolTip">
        <Setter.Value>
          <MultiBinding Converter="{StaticResource ErrorMessageConverter}">
            <Binding RelativeSource="{RelativeSource Self}" Path="Tag"/>
          </MultiBinding>
        </Setter.Value>
      </Setter>

    </Trigger>
  </Style.Triggers>
</Style>

Это работает очень хорошо, но если я хочу использовать более сложную всплывающую подсказку, я не могу больше понять, как привязать «Tag» для значения конвертера. Например;

...
<Setter Property="ToolTip">
  <Setter.Value>
    <StackPanel>
      <TextBlock>
        <TextBlock.Text>
          <MultiBinding Converter="{StaticResource ErrorMessageConverter}">

            <!-- item of interest -->
            <Binding RelativeSource=" what goes here?? "/>
          </MultiBinding>
        </TextBlock.Text>
      </TextBlock>
      <Image/>
    </StackPanel>
  </Setter.Value>
</Setter>
...

Я пробовал несколько вариантов 'FindAncestor' и что-то не относительное, но я не могу заставить что-либо работать. Есть идеи ??


ОБНОВЛЕНИЕ: 12-29-2010: Вот правильный код, ответ, предоставленный нашим другом Гоблином ниже. Работает отлично!

...
<Setter Property="ToolTip">
  <Setter.Value>
    <!-- Item of interest -->
      <ToolTip DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}">
      <StackPanel>
        <Image/>
        <TextBlock>
          <TextBlock.Text>
            <MultiBinding Converter="{StaticResource ErrorMessageConverter}">
              <Binding Path="Tag"/>
            </MultiBinding>
          </TextBlock.Text>
        </TextBlock>
      </StackPanel>
    </ToolTip>
  </Setter.Value>
</Setter>
...

Ответы [ 3 ]

3 голосов
/ 02 декабря 2010

См. Карл Шиффлетт для полного объяснения того, как наследовать DataContext элемента-владельца из подсказки: http://karlshifflett.wordpress.com/2007/12/29/wpf-sample-series-data-binding-in-tooltip/

Это не совсем учебник :)

2 голосов
/ 02 декабря 2010

Проблема в том, что всплывающие подсказки - это всплывающие окна, которые существуют вне основного визуального дерева, что приводит к разрыву как RelativeSource, так и ElementName при поиске элементов вне подсказки. Самый простой способ обойти это - использовать унаследованный DataContext для ваших привязок, так как он передается во всплывающую подсказку, но это не всегда дает доступ к тому, что вам нужно.

Альтернативой является использование пользовательского свойства Attached, объявленного с FrameworkMetadataOptions.Inherits. Затем вы можете установить значение для этого свойства в объекте владельца (в данном случае в TextBox), а затем получить доступ к унаследованному значению для любого элемента внутри всплывающей подсказки. В этом случае вместо тега вы устанавливаете значение свойства Attached.

0 голосов
/ 02 декабря 2010

Попробуйте использовать x:Name для элемента управления с подсказкой, а затем <Binding ElementName="yourName" Path="Tag"> для привязки.

...