2014-12-11 5 views
0

следующее определение управления работает нормально:Свойство, установленное в стиле, не может быть отменено с привязкой в ​​xaml?

<local:TextBoxEx Text="{Binding Title, UpdateSourceTrigger=PropertyChanged, Delay=900}" 
       Foreground="{Binding Selection.Error, Converter={StaticResource BoolToErrorBrush}}"/> 

Когда я изменить его, используя стиль:

<Style x:Key="TextBoxTitle" TargetType="local:TextBoxEx"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <local:TextBoxEx Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" 
           Foreground="Blue"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<local:TextBoxEx Text="{Binding Title, UpdateSourceTrigger=PropertyChanged, Delay=900}" 
       Style="{StaticResource TextBoxTitle}" 
       Foreground="Pink"/> 

Связывание с Заголовок отменит стиль связывания в текст и работает.
Настройка цвета переднего плана не имеет эффекта, он по-прежнему остается синим. Когда я использую Foreground="{TemplateBinding Foreground}" в стиле controltemplate, он работает.

Я не могу понять это поведение, не так ли?
В первом случае локальное определение является ведущим, во втором - нет.

ответ

1

Я не понимаю, что здесь не так. RelativeSource для TemplatedParent будет искать свойство Text в исходном компоненте во время выполнения, свойство которого привязано к Title. Это по сути эквивалентно TemplateBinding для текста (но это slower).

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

Я не понимаю вашу проблему здесь.

+0

Моя проблема была в том, что я не получил разницу между TemplatedParent и ControlTemplate. – Gerard

0

В шаблоне управления вам необходимо привязать данные к свойствам управления, то есть к TextBoxEx, и когда вы используете элемент управления и привяжите его к DataContext, вы передаете данные в шаблон управления с помощью элемента управления, когда вы устанавливаете Foreground для синий в контрольном шаблоне вы тормозите трубку, а цвет управления будет синим, независимо от того, что вы делаете.
DataContext -> Control -> ControlTemplate
, когда вы устанавливаете синий цвет в шаблоне управления, вы разрезаете вторую стрелку
DataContext - > Control XXXXX ControlTemplate
поэтому синий синий независимо от того, что вы делаете
см. MSDN ControlTemplate для получения дополнительной информации