2009-08-29 4 views
15

Я пытаюсь сделать что-то вроде этого ...Может ли мой стильный редактор WPF использовать 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.

Как обеспечить «имя типа квалификационную»?

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

Спасибо.

EDIT:

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

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

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

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

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

EDIT 2:

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

Links the value of a property in a control template to be the value of some other exposed property on the templated control.

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

ответ

31

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

От MSDN documentation:

A TemplateBinding is an optimized form of a Binding for template scenarios, analogous to a Binding constructed with {Binding RelativeSource={RelativeSource TemplatedParent}}.

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

Я использовал это решение, когда пытался создать пользовательский шаблон элемента управления Button, в котором (String) Содержимое кнопки необходимо привязать к текстуу 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> 
+0

Отличная идея, Шейн. Благодарю. – devuxer

3

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

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

+1

Спасибо, @Kent. Ваш ответ дал мне идею попробовать (см. Мое редактирование выше), но это не сработало. Имеет смысл, что 'TemplateBinding' можно использовать только в ControlTemplate ... если бы я мог убедить анализатор, что я намерен использовать этот стиль только в ControlTemplate ... – devuxer