簡體   English   中英

WPF TemplateBinding不適用於每個屬性

[英]WPF TemplateBinding does not work for every property

我已經創建了自定義控件,但是TemplateBinding不適用於每個屬性嗎? 如果我使用僅轉發原始值的虛擬Converter,則模板綁定確實開始工作。 具有相同問題的簡化示例:

<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>

后面的代碼:

public class ElipticProgressBar : Control
{
    static ElipticProgressBar()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ElipticProgressBar), new FrameworkPropertyMetadata(typeof(ElipticProgressBar)));
    }

    public static readonly DependencyProperty BarTicknessProperty = DependencyProperty.Register(
        "BarTickness", typeof(int), typeof(ElipticProgressBar), new FrameworkPropertyMetadata(default(int)));

    public int BarTickness
    {
        get { return (int)GetValue(BarTicknessProperty); }
        set { SetValue(BarTicknessProperty, value); }
    }

    public static readonly DependencyProperty BarColorProperty = DependencyProperty.Register(
        "BarColor", typeof(Brush), typeof(ElipticProgressBar), new FrameworkPropertyMetadata(default(Brush)));

    public Brush BarColor
    {
        get { return (Brush)GetValue(BarColorProperty); }
        set { SetValue(BarColorProperty, value); }
    }
}

用法:

controls:ElipticProgressBar BarTickness="30" BarColor="Orange"

DebugConverter:

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}將其直接綁定到TextBlockText屬性。

文檔指出{TemplateBinding}

用於模板方案的Binding的優化形式,類似於使用{Binding RelativeSource={RelativeSource TemplatedParent}}構造的{Binding RelativeSource={RelativeSource TemplatedParent}}

有一些限制-最重要的是, 它僅在視覺樹中起作用!


這對您的特定情況意味着什么:雖然您不能使用

<TextBlock Text="{TemplateBinding BarTickness}" />

您可以(必須)使用

<TextBlock Text="{Binding BarTickness, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" />

因為TextBlock.Text屬性是string類型,而BarTickness不是。

{TemplateBinding}不會進行這種轉換; 這就是為什么您需要使用更通用的{Binding}或轉換器,而這兩種方法

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;
}

兩者都將實際值轉換為object

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM