WPF / XAML - используйте «Стиль» для создания всплывающей подсказки с именем элемента модели - PullRequest
0 голосов
/ 11 февраля 2020

У нас очень сложный вопросник в WPF с сотнями элементов управления. Группы элементов управления объединены в UserControls для лучшей организации разделов. Они видны / свернуты в зависимости от множества факторов. Эта анкета меняется ежеквартально из-за смены поставщиков. Мы связываем модель данных с текстом данных. Имена свойств модели совпадают с именами столбцов базы данных.

Когда вопросник отправляется в QA, им нужен какой-то простой способ связать элемент управления вопросника со столбцом базы данных. В рамках своей должной осмотрительности они проверяют, что значение в базе данных совпадает с тем, что они ввели в GUI.

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

Я пытаюсь найти простой способ просто использовать отражение в глобальный

1 Ответ

1 голос
/ 11 февраля 2020

Вы можете сделать это, вызвав GetBindingExpression для соответствующего элемента, передав интересующее вас свойство зависимости. Имя будет в свойстве ResolvedSourcePropertyName полученного выражения.

Конвертер, который вы ищете, выглядит примерно так:

public class BindingConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value as FrameworkElement)?.GetBindingExpression(parameter as DependencyProperty)?.ResolvedSourcePropertyName;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

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

Вернувшись в свой XAML, вы просто делаете это:

xmlns:controls="clr-namespace:System.Windows.Controls;assembly=PresentationFramework"

<Window.Resources>

    <local:BindingConverter x:Key="BindingConverter" />

    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="ToolTip">
            <Setter.Value>
                <ToolTip Content="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Mode=Self}, Converter={StaticResource BindingConverter}, ConverterParameter={x:Static controls:TextBlock.TextProperty}}"/>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="{x:Type RadioButton}">
        <Setter Property="ToolTip">
            <Setter.Value>
                <ToolTip Content="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Mode=Self}, Converter={StaticResource BindingConverter}, ConverterParameter={x:Static controls:RadioButton.IsCheckedProperty}}"/>
            </Setter.Value>
        </Setter>
    </Style>

</Window.Resources>

<StackPanel Orientation="Vertical">
    <TextBlock Text="{Binding MyTextField}" />
    <RadioButton IsChecked="{Binding MyBooleanField}" Content="Click Me" />
</StackPanel>

(Кстати, причина, по которой исходный код не работал, заключается в том, что поскольку всплывающие подсказки не являются дочерними элементами визуального дерева их «родительского» элемента управления, поэтому вместо этого необходимо выполнить привязку через PlacementTarget).

...