Короткий ответ - нет. ControlTemplate по сути является черным ящиком, по крайней мере, в том, что касается XAML (есть способы вырыть визуальное дерево в коде).
Когда вы говорите, что «не можете использовать TemplateBinding», почему бы и нет? Если вам просто не хватает доступных свойств, которые можно исправить, создав некоторые вложенные свойства для значений, которые вы хотите передать. Это предполагает, что вы создаете шаблон элемента управления, который вы не можете изменить, в противном случае вы можете просто добавить новые свойства зависимостей.
Прикрепленное свойство:
public static class CustomProps
{
public static readonly DependencyProperty MyNewBrushProperty = DependencyProperty.RegisterAttached(
"MyNewBrush",
typeof(Brush),
typeof(CustomProps),
new UIPropertyMetadata(Brushes.Green));
public static Brush GetMyNewBrush(DependencyObject target)
{
return (Brush)target.GetValue(MyNewBrushProperty);
}
public static void SetMyNewBrush(DependencyObject target, Brush value)
{
target.SetValue(MyNewBrushProperty, value);
}
}
И использование в стиле и шаблоне:
<Style TargetType="{x:Type Button}">
<Setter Property="local:CustomProps.MyNewBrush" Value="Red" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:CustomProps.MyNewBrush)}">
<ContentPresenter/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Использование этого метода также позволяет переопределять значения в отдельных экземплярах.