2009-08-29 13 views
15

Próbuję zrobić coś takiego ...Czy mój selektor stylu WPF może użyć szablonu 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> 

... ale pojawia się błąd: 'Padding' member is not valid because it does not have a qualifying type name.

Jak mogę zapewnić „określającym nazwę typu”?

Uwaga: Powodem, dla którego próbuję to zrobić, jest to, że chciałbym dołączyć tę samą ramkę w szeregu podobnych kontrolek.

Dzięki.

EDIT:

No to próbowałem ...

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

... i faktycznie skompilowany, ale wtedy, gdy wpadłem aplikację, mam XamlParseException:

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

Myślałem, że może kwalifikować Padding z GridViewColumnHeader (który jest ControlTemplate, z którego chcę korzystać w tym stylu) działa, ale nie ma kości.

EDIT 2:

Cóż, według dokumentacji TemplateBinding, to mówi:

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

Tak brzmi to co próbuję zrobić, to po prostu niemożliwe. Naprawdę chciałbym móc tworzyć style wielokrotnego użytku dla niektórych kontrolek w szablonach kontrolnych, ale przypuszczam, że powiązania szablonów nie mogą być zawarte w tych stylach.

Odpowiedz

31

To powinno działać w przypadku, gdy jesteś szablonów kontroli i chcesz powiązać wartość właściwości tej kontroli do właściwości innego kontroli wewnątrz szablonu. W twoim przypadku masz templating coś (nazywają to MyControl) oraz, że szablon będzie zawierać granicę którego Wyściółka powinna być związana z wyściółką MyControl użytkownika.

Od MSDN documentation:

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

Z jakiegoś powodu, określając TemplatedParent jako źródło wiązania nie wydają się działać w stylu seterów. Aby obejść, które można określić względną rodzica być AncestorType kontroli jesteś szablonów (które skutecznie odnajduje TemplatedParent świadczenia nie zostały osadzone inne MyControls w szablonie MyControl).

Użyłem tego rozwiązania, gdy próbowałem niestandardowego szablonu kontrolki Button, w której zawartość (String) przycisku musiała być powiązana z właściwością Text obiektu TextBlock na ControlTemplate dla przycisku.Oto, jak wyglądał ten kod:

<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

Świetny pomysł, Shane. Dzięki. – devuxer

3

Właściwość można zakwalifikować, po prostu dodając jej nazwę typu. Na przykład: Border.Padding zamiast Padding.

Jednak nie jestem pewien, czy ma sens dla twojego scenariusza. TemplateBinding s są używane wewnątrz szablonu sterowania.

+1

Dzięki, @Kent. Twoja odpowiedź dała mi pomysł wypróbowania (zobacz moją edycję powyżej), ale to nie zadziałało. To ma sens, że 'TemplateBinding's może być użyty tylko w ControlTemplate ... gdybym tylko mógł przekonać parser, że zamierzam użyć tego stylu tylko w ControlTemplate ... – devuxer

Powiązane problemy