none
Как в тултипе сделать биндинг на свойство связанного с тултипом контрола? RRS feed

  • Вопрос

  • Добрый день!
    Прошу подсказать, в чем ошибка. 
    Есть юзерконтрол SearchComboBox, в нем строковое DependencyProperty с именем ErrorString. Есть конвертер isNullConverter, который возвращает False, если в ErrorString есть к-л текст. 
    В App.xaml создаю стиль, прикручиваю к SearchComboBox на форме:

    <Style x:Key="ValidatedControlStyle" TargetType="controls:SearchComboBox">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=ErrorString, Converter={StaticResource isNullConverter}, Mode=TwoWay}" Value="False">
                            <Setter Property="ToolTipService.InitialShowDelay" Value="0"/>
                            <Setter Property="ToolTip" >
                                <Setter.Value>
                                    <Grid Background="Aqua">
                                        <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls:SearchComboBox}}, Path=ErrorString}"/>
                                    </Grid>
                                </Setter.Value>
                            </Setter>
                            <Setter Property="ToolTip.IsOpen" Value="True"/>
                            <Setter Property="ToolTip.StaysOpen" Value="True"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>

    Смысл - показать тултип, если строка ErrorString не пустая. По заполнению строки, тултип всплывает. Но пустой. В окне вывода ошибка:

    System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='RioClient.Controls.SearchComboBox', AncestorLevel='1''. BindingExpression:Path=ErrorString; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

    Почему? Что я сделал не так?
    Заранее спасибо за ответ.

    1 ноября 2016 г. 2:16

Ответы

  • У ToolTip есть одна беда, которую я заметил еще при первом знакомстве с WPF. Он не работает, если его вызывать из XAML или если он сделан через биндинг. Если же вызвать его из кода, то все ОК. Почему так я не разобрался в итоге нашел обходной путь для своей задачи.

    Вы, например, можете вместо ToolTip использовать строку с текстом ошибки, которая будет появляться только в случае наличия ошибки.


    VB.Net - WPF, UWP

    • Помечено в качестве ответа SvarogichRed 2 ноября 2016 г. 2:13
    1 ноября 2016 г. 12:13
    Отвечающий

Все ответы

  • Добрый день.

    FindAncestor хорошо ищет по визуальному дереву, но когда есть стили, DataTemplate-ы, ControlTemplate-ы, начинаются проблемы.

    Самый быстрый вариант, сделайте у вашего контрола еще одно свойство для хранения текста ToolTip-а и внутри биндитесь к нему, а с наружи куда вам там надо.

    1 ноября 2016 г. 6:21
    Отвечающий
  • Не понял Вашу мысль. Внутри - это в XAML-е контрола? Снаружи я биндюсь к ErrorString (внешняя форма проверяет корректность данных в SearchComboBox, если всё плохо, то выставляет в ErrorString сообщение), а внутри как контрол на это должен реагировать? Тултип вручную открывать, из кода? Или привязать внутреннее свойство (пусть ErrStr2) к тултипу вышеуказанным XAML-ом? А выставлять ErrStr2 в коде, на сеттере ErrorString?
    1 ноября 2016 г. 8:10
  • У ToolTip есть одна беда, которую я заметил еще при первом знакомстве с WPF. Он не работает, если его вызывать из XAML или если он сделан через биндинг. Если же вызвать его из кода, то все ОК. Почему так я не разобрался в итоге нашел обходной путь для своей задачи.

    Вы, например, можете вместо ToolTip использовать строку с текстом ошибки, которая будет появляться только в случае наличия ошибки.


    VB.Net - WPF, UWP

    • Помечено в качестве ответа SvarogichRed 2 ноября 2016 г. 2:13
    1 ноября 2016 г. 12:13
    Отвечающий
  • Ясно, спасибо всем.

    Сделал вызов тултипа из кода.

    Изначально я хотел сделать универсальный стиль, привязываемый к разным контролам, чтобы унифицировать их реакции на неверный ввод и облегчить себе жизнь. Ну, не судьба :)

    2 ноября 2016 г. 2:21
  • поправил, но не помогло.

    В профиле ссылки уже нет, рядом с ником почему-то есть

    • Изменено SvarogichRed 3 ноября 2016 г. 2:34
    3 ноября 2016 г. 2:33
  • У ToolTip есть одна беда, которую я заметил еще при первом знакомстве с WPF. Он не работает, если его вызывать из XAML

    Вызывать через XAML это просто прописать в XAML или есть какой то вызов?

    Если просто в XAML у меня вот так всё работает

        <GroupBox
                    Grid.Row="1"
                    Grid.ColumnSpan="2"
                    Header="Объекты"
                    Style="{StaticResource GroupBoxBaseStyle}"
                    ToolTip="Например .... и т.п.">
    Может подправили работу ToolTip. Binding не проверял не знаю.

    3 ноября 2016 г. 16:39
  • Вызывать через XAML это просто прописать в XAML или есть какой то вызов?

    Имеется ввиду вызов через триггеры или задание тултипа через привязку. Обычное задание в XAML никаких проблем не вызывает.

    VB.Net - WPF, UWP

    3 ноября 2016 г. 17:08
    Отвечающий
  • Понял учту
    3 ноября 2016 г. 17:17