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