Может ли мой WPF Style Setter использовать TemplateBinding?

Я пытаюсь сделать что-то вроде этого...

<Style
    x:Key="MyBorderStyle"
    TargetType="Border">
    <Setter
        Property="BorderBrush"
        Value="{StaticResource MyBorderBrush}" />
    <Setter
        Property="Background"
        Value="{StaticResource MyBackgroundBrush}" />
    <Setter
        Property="Padding"
        Value="{TemplateBinding Padding}" />
</Style>

... но я получаю ошибку: 'Padding' member is not valid because it does not have a qualifying type name.

Как мне предоставить "имя квалификационного типа"?

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

Спасибо.

EDIT:

Ну, я пробовал это...

<Setter
    Property="Padding"
    Value="{TemplateBinding GridViewColumnHeader.Padding}" />

... и он действительно скомпилирован, но затем, когда я запустил приложение, я получил XamlParseException:

Cannot convert the value in attribute 'Value' to object of type ''.

Я подумал, что, возможно, квалификационный Padding с GridViewColumnHeader (который является элементом ControlTemplate, который я хочу использовать с этим стилем) будет работать, но не кубик.

ИЗМЕНИТЬ 2:

Хорошо, согласно документации для TemplateBinding, он говорит:

Связывает значение свойства в шаблоне управления как значение какого-либо другого открытого свойства в шаблонизированном элементе управления.

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

Ответы

Ответ 1

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

От Документация MSDN:

A TemplateBinding - это оптимизированная форма сценария Binding для шаблонов, аналогичная привязке, построенной с помощью {Binding RelativeSource = {RelativeSource TemplatedParent}}.

По какой-либо причине указание TemplatedParent как источника привязки не работает в настройках стиля. Чтобы обойти это, вы можете указать относительный родитель как AncestorType элемента управления, который вы используете templating (который эффективно находит TemplatedParent, если вы не ввели другие MyControls в шаблон MyControl).

Я использовал это решение, когда пытался создать настраиваемый шаблон элемента управления Button, в котором (String) Содержимое кнопки необходимо привязать к свойству Text объекта TextBlock в ControlTemplate для кнопки. Вот как выглядел этот код:

<StackPanel>
    <StackPanel.Resources>
        <ControlTemplate x:Key="BarButton" TargetType="{x:Type Button}">
            <ControlTemplate.Resources>
                <Style TargetType="TextBlock" x:Key="ButtonLabel">
                    <Setter Property="Text" Value="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type Button}} }" />
                </Style>
            </ControlTemplate.Resources>
            <Grid>
                <!-- Other controls here -->
                <TextBlock Name="LabelText" Style="{StaticResource ButtonLabel}" />
            </Grid>
        </ControlTemplate>
    </StackPanel.Resources>
    <Button Width="100" Content="Label Text Here" Template="{StaticResource BarButton}" />
</StackPanel>

Ответ 2

Свойство можно квалифицировать просто путем префикса его с именем типа. Например, Border.Padding вместо Padding.

Однако я не уверен, что это имеет смысл для вашего сценария. TemplateBinding используются внутри шаблона управления.