通过两个级别绑定到TemplatedParent

Xas*_*ser 4 data-binding wpf xaml templates

我确信这已经解决了,但我找不到合适的解决方案.我可能只是不知道我正在寻找的条款.

假设我有这个自定义控件模板

<Style x:Key="ColorPicker" TargetType="{x:Type local:ColorPicker}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ColorPicker}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <Thumb Width="30" Height="30" Canvas.Left="0" Canvas.Top="0">
                        <Thumb.Style>
                            <Style TargetType="Thumb">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate>
                                            <Ellipse Fill="{TemplateBinding SelectedColor}" Width="30" Height="30" Stroke="Black" StrokeThickness="1" />
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </Thumb.Style>
                    </Thumb>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

其中SelectedColor是ColorPicker的属性.在上面的示例中,模板绑定将SelectedColor在模板父类型中查找Thumb,但是如何才能获得与第二级模板父级的绑定?

Stí*_*ndr 5

Fill="{Path=SelectedColor, RelativeSource={RelativeSource FindAncestor, AncestorType={local:ColorPicker}}}"
Run Code Online (Sandbox Code Playgroud)

在ColorPicker样式中,这将遍历ColorPickers属性,而不是Thumb上的属性.我通常认为这是一个更安全的绑定,几乎不使用TemplateBinding.使用TemplateBinding在customcontrols中烧了这么多次!

无论如何完整代码:)

<Style x:Key="ColorPicker" TargetType="{x:Type local:ColorPicker}">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type local:ColorPicker}">
            <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                <Thumb Width="30" Height="30" Canvas.Left="0" Canvas.Top="0">
                    <Thumb.Style>
                        <Style TargetType="Thumb">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate>
                                        <Ellipse Fill="{Path=SelectedColor.Color, RelativeSource={RelativeSource FindAncestor, AncestorType={local:ColorPicker}}}" Width="30" Height="30" Stroke="Black" StrokeThickness="1" />
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </Thumb.Style>
                </Thumb>
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>
Run Code Online (Sandbox Code Playgroud)

WPF Cheatsheet是所有类型绑定的紧凑列表,非常方便!

干杯,

了Stian