2016-09-09 3 views
0

В пользовательском элементе управления я хотел бы использовать стиль (заданный как DependencyProperty) для TextBlock в моем шаблоне.DependencyProperty типа Style в пользовательском контроле

MyControl.cs

public static DependencyProperty HeadingStyleProperty = 
    DependencyProperty.Register("HeadingStyle", 
           typeof (Style), 
           typeof (MyControlElement), 
           new PropertyMetadata(new Style(typeof(TextBlock)))); 

public Style HeadingStyle { 
    get { return (Style) GetValue(HeadingStyleProperty); } 
    set { SetValue(HeadingStyleProperty, value); } 
} 

MyControl.xaml

<ResourceDictionary ...> 
    <Style TargetType="local:MyControl"> 
     <Style.Resources> 
      <!-- Getting error on BasedOn="TemplateBinding --> 
      <Style TargetType="TextBlock" BasedOn="{TemplateBinding HeadingStyle}" x:Key="Heading" /> 
     </Style.Resources> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <TextBlock Style="{StaticResource Heading}" Text="StyledHeading" /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

Я получаю ошибку компилятора член 'HeadingStyle' не является допустимым, поскольку он не имеет названия квалификационного типа.

Должен ли я изменить DataType моего DP из стиля на более конкретный? Или что вызывает эту ошибку. Начальное значение DP устанавливаются в стиль для TargetType TextBlock ...

+0

Это WPF, вам может потребоваться изменить TargetType, чтобы включить type, 'TargetType = "{x: Type TextBlock}" ' –

+0

, это не исправляет мою проблему. Я думаю, что это вызвано в моем DP (возможно, мне нужно определить DP по-другому, если это стиль ...). – WPFGermany

ответ

2

Прежде всего, Styleне проистекают из DependencyObject, так что вы не можете установить любую привязку на нем.

Если вы хотите, чтобы ваши TextBlock (который является частью шаблона), чтобы быть в стиле вашей собственности, просто установите TemplateBinding на его имущество Style непосредственно (что бы цель стиля вы определили как ресурс в любом случае?) , Это можно сделать двумя способами. Одним из них является использование полное имя свойства:

<ControlTemplate> 
    <TextBlock Style="{TemplateBinding local:MyControl.HeadingStyle}" (...) /> 
</ControlTemplate> 

Другой способ, более обычно используется, чтобы использовать упрощенное имя свойства, но это требует ControlTemplate.TargetType должны быть указаны:

<ControlTemplate TargetType="{x:Type local:MyControl}"> 
    <TextBlock Style="{TemplateBinding HeadingStyle}" (...) /> 
</ControlTemplate> 

Второй метод работает, потому что анализатор XAML достаточно умен, чтобы узнать, как разрешить свойство HeadingStyle - если вы не указали ControlTemplate.TargetType, вы получите ту же самую ошибку, которую вы сейчас получаете.

Конечно, вы можете обмануть компилятор для компиляции кода, используя полное имя свойства:

<Style x:Key="Heading" BasedOn="{TemplateBinding local:MyControl.HeadingStyle}" (...) /> 

, но это приведет к ошибке во время выполнения, говоря, что TemplateBindingExpression не могут быть преобразованы в Style.

+0

спасибо, что работает! Использование стиля в моей ControlTemplate как ресурсе может быть оставлено в моем случае, поэтому я напрямую привязываю HeadingStyle. – WPFGermany

Смежные вопросы