Проверена привязка видимости всплывающей подсказки WPF к RadioButton

#c# #wpf #xaml #data-binding #wpf-controls

#c# #wpf #xaml #привязка к данным #wpf-элементы управления

Вопрос:

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

 <Page.Resources>
    <BooleanToVisibilityConverter x:Key="b2v" />
</Page.Resources>
 

Переключатели, чтобы определить, видна ли всплывающая подсказка. ToolTip должно быть видно, когда установлен флажок «inputText».

 <RadioButton x:Name="InputText" Content="InputText" IsChecked="True" />
<RadioButton x:Name="Other" Content="Other" />
 

Переключатель с всплывающей подсказкой

 <RadioButton x:Name="InputRows" Content="Rows">
    <RadioButton.ToolTip>
        <ToolTip x:Name="InputRowsToolTip"
                 Visibility="{Binding IsChecked,ElementName=InputText, Converter={StaticResource b2v}}">
            ToolTip text here
        </ToolTip>
    </RadioButton.ToolTip>
</RadioButton>
 

Другие вещи, которые я пробовал, не работают:

  • Оберните текст всплывающей подсказки в a <TextBlock> и включите туда параметр видимости — никакого эффекта.
  • Используйте <TextBlock> вместо <ToolTip> и включите параметр видимости там — никакого эффекта.
  • Добавить ToolTipService.ShowOnDisabled="False" и ToolTipService.IsEnabled="False" во всплывающую подсказку, и RadioButton — всплывающая подсказка вообще не отображается.

Я могу заставить его вести себя так, как я хочу, с помощью методов в файле cs для InputTextRadioButton_Checked and OtherRadioButton_Checked и установить InputRowsToolTip.Visibility = Visibility.Visible or Visibility.Collapsed в зависимости от RadioButton, но, похоже, я должен быть в состоянии сделать это с помощью BooleanToVisibilityConverter, поскольку он работает для других элементов управления.

Ответ №1:

Я только что добавил DataContext InputRows

 DataContext="{Binding ElementName=InputText"
 

И ваш код.

 <RadioButton x:Name="InputText" Content="InputText" IsChecked="True" />
<RadioButton x:Name="Other" Content="Other" />

<RadioButton x:Name="InputRows" Content="Rows" DataContext="{Binding ElementName=InputText}">
    <RadioButton.ToolTip>
        <ToolTip x:Name="InputRowsToolTip"
                 Visibility="{Binding RelativeSource={RelativeSource Self}, Path=DataContext.IsChecked, Converter={StaticResource b2v}}">
            ToolTip text here
        </ToolTip>
    </RadioButton.ToolTip>
</RadioButton>
 

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

Вы не можете использовать форму ниже.

  • ElementName
  • RelativeSource AncestorType
  • Relative Source TemplateParent

этот пример исходного кода https://github.com/ncoresoftsource/stackoverflowsample/tree/main/src/answers/radiobutton-tooltip-other-binding

Комментарии:

1. Это не работает. Всплывающие подсказки остаются видимыми независимо от того, какой переключатель выбран.

2. @LisaB Я подтвердил, что образец исходного кода создан и выполнен. Вы хотите, чтобы я прикрепил пример исходного кода?

3. github.com/ncoresoftsource/stackoverflowsample/tree/main/src/…

4. Если я что-то пропустил, пожалуйста, скажите мне!

5. Спасибо! Код в вашем github сработал. В коде в вашем исходном ответе отсутствовал «DataContext» в «Path= DataContext. Проверено».