Может ли мой WPF Style Setter использовать TemplateBinding? - PullRequest
20 голосов
/ 29 августа 2009

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

<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, написано:

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

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

Ответы [ 2 ]

36 голосов
/ 22 июня 2010

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

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

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

По какой-то причине указание TemplatedParent в качестве источника для привязки не работает в Style Setters. Чтобы обойти это, вы можете указать относительный родительский элемент как AncestorType элемента управления, который вы шаблонируете (который эффективно находит 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>
3 голосов
/ 29 августа 2009

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

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

...