C# WPF TemplateBinding并不适用于所有属性

C# WPF TemplateBinding并不适用于所有属性,c#,wpf,C#,Wpf,我已经创建了自定义控件,但是TemplateBinding并不是对每个属性都有效吗? 如果我使用只转发原始值的虚拟转换器,模板绑定就开始工作了。 具有相同问题的简化示例: <Style TargetType="{x:Type controls:ElipticProgressBar}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate

我已经创建了自定义控件,但是TemplateBinding并不是对每个属性都有效吗? 如果我使用只转发原始值的虚拟转换器,模板绑定就开始工作了。 具有相同问题的简化示例:

<Style TargetType="{x:Type controls:ElipticProgressBar}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:ElipticProgressBar}">
                <ControlTemplate.Resources>
                    <converters:DebugConverter x:Key="DebugConverter"/>
                </ControlTemplate.Resources>
                <StackPanel>
                    <!--BarColor works always-->
                    <!--BarTickness works-->
                    <Label Background="{TemplateBinding BarColor}" Content="{TemplateBinding BarTickness}"/>
                    <!--BarTickness does not works-->
                    <TextBlock Background="{TemplateBinding BarColor}" Text="{TemplateBinding BarTickness}"/>
                    <!--BarTickness works-->
                    <TextBlock Background="{TemplateBinding BarColor}" Text="{Binding BarTickness, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"/>
                    <!--BarTickness works-->
                    <TextBlock Background="{TemplateBinding BarColor}" Text="{TemplateBinding BarTickness, Converter={StaticResource DebugConverter}}"/>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
用法:

controls:ElipticProgressBar BarTickness="30" BarColor="Orange"
调试转换器:

public class DebugConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}
{TemplateBinding}是绑定的优化版本,有一些限制

在这种情况下,您需要将BarThickness属性的类型更改为string,以便能够使用{TemplateBinding}将其直接绑定到TextBlock的Text属性。

模板场景绑定的优化形式,类似于使用{Binding RelativeSource={RelativeSource TemplatedParent}构建的绑定

有一些限制-最重要的是,它只能在视觉树中工作

这对您的具体情况意味着什么:虽然您不能使用

<TextBlock Text="{TemplateBinding BarTickness}" />
两者都将实际值转换为对象

<TextBlock Text="{TemplateBinding BarTickness}" />
<TextBlock Text="{Binding BarTickness, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" />
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    return value;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    return value;
}