2017-02-02 2 views
2

Записи в моем Application.ResourcesResourceDictionary шаблон управления, который, похудел, выглядит примерно следующим образом:RelativeSource переплетных работ от стиля, но не ControlTemplate

<ControlTemplate TargetType="{x:Type ToggleButton}"> 
    <Border> 
     <Border.BorderBrush> 
      <SolidColorBrush Color="{Binding Path=BorderColor, RelativeSource={RelativeSource AncestorType=UserControl}" /> 
     </Border.BorderBrush> 
    </Border> 
</ControlTemplate> 

Каждый UserControl имеет свою собственность BorderColor, который это тянет из , В этом примере привязка не находит свойство.

Не удается найти источник для связывания со ссылкой 'RelativeSource FindAncestor, AncestorType =' System.Windows.Controls.UserControl ' AncestorLevel = '1''.

Однако, он работает в другой записи в словаре:

<Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}"> 
    <Setter Property="BorderBrush" Value="{Binding Path=BorderColor, RelativeSource={RelativeSource AncestorType=UserControl}"/> 
</Style> 

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

ответ

1

два предложения:

Если ControlTemplate является частью стиля вы можете установить BorderBrush свойство ToggleButton к SolidColorBrush связыванию и использовать TemplateBinding в шаблоне:

<Style x:Key="myStyle" TargetType="ToggleButton"> 
    <Setter Property="BorderBrush"> 
     <Setter.Value> 
      <SolidColorBrush Color="{Binding Path=BorderColor, RelativeSource={RelativeSource AncestorType=UserControl}}" /> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ToggleButton}"> 
       <Border BorderBrush="{TemplateBinding Background}" BorderThickness="10"> 
        <TextBlock>....</TextBlock> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Если вы хотите определить автономный шаблон ControlTemplate по какой-то причине обходным путем было бы привязать свойство Brush вместо свойства Color:

<ControlTemplate TargetType="{x:Type ToggleButton}"> 
    <Border BorderBrush="{Binding Path=BorderBrushProperty, RelativeSource={RelativeSource AncestorType=UserControl}}" BorderThickness="10"> 
     <TextBlock>....</TextBlock> 
    </Border> 
</ControlTemplate> 
+0

Я сделал некоторую перекодировку шаблона, чтобы превратить его в стиль, как в первом примере. Используя «TemplateBinding», тогда работало, спасибо! Теперь, чтобы обновить его динамически ... – Dan

0

Он работает, если вы используете Background вместо BorderColor. Является ли BorderColor вашей собственностью?

<Window.Resources> 
<ControlTemplate x:Key="template" TargetType="{x:Type ToggleButton}"> 
    <Border> 
     <Border.BorderBrush> 
       <SolidColorBrush Color="{Binding Path=Background,RelativeSource={RelativeSource AncestorType=UserControl}}" /> 
     </Border.BorderBrush> 
    </Border> 
</ControlTemplate> 
</Window.Resources> 

<UserControl Background="Aqua"> 
    <ToggleButton Template="{StaticResource template}"></ToggleButton> 

</UserControl> 
Смежные вопросы