【问题标题】:RelativeSource binding works from Style but not ControlTemplateRelativeSource 绑定适用于 Style 但不适用于 ControlTemplate
【发布时间】:2017-06-19 20:33:07
【问题描述】:

我的Application.Resources ResourceDictionary 中的一个条目是一个控件模板,经过精简后,看起来类似于以下内容:

<ControlTemplate TargetType="{x:Type ToggleButton}">
    <Border>
        <Border.BorderBrush>
            <SolidColorBrush Color="{Binding Path=BorderColor, RelativeSource={RelativeSource AncestorType=UserControl}" />
        </Border.BorderBrush>
    </Border>
</ControlTemplate>

每个UserControl 都有自己的属性BorderColor,这是从中提取的。在本例中,绑定找不到属性。

找不到与引用“RelativeSource”绑定的源 FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''。

但是,它适用于字典中的另一个条目:

<Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="BorderBrush" Value="{Binding Path=BorderColor, RelativeSource={RelativeSource AncestorType=UserControl}"/>
</Style>

如何修复第一个示例中的绑定?最好我不希望用户控件中每个控件的实例上都需要额外的属性。

【问题讨论】:

    标签: c# wpf xaml data-binding


    【解决方案1】:

    两个建议:

    如果 ControlTemplate 是 Style 的一部分,您可以通过绑定将 ToggleButton 的 BorderBrush 属性设置为 SolidColorBrush,并在模板中使用 TemplateBinding

    <Style x:Key="myStyle" TargetType="ToggleButton">
        <Setter Property="BorderBrush">
            <Setter.Value>
                <SolidColorBrush Color="{Binding Path=BorderColor, RelativeSource={RelativeSource AncestorType=UserControl}}" />
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToggleButton}">
                    <Border BorderBrush="{TemplateBinding Background}" BorderThickness="10">
                        <TextBlock>....</TextBlock>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    如果您出于某种原因想要定义独立的 ControlTemplate,解决方法是绑定到 Brush 属性而不是 Color 属性:

    <ControlTemplate TargetType="{x:Type ToggleButton}">
        <Border BorderBrush="{Binding Path=BorderBrushProperty, RelativeSource={RelativeSource AncestorType=UserControl}}" BorderThickness="10">
            <TextBlock>....</TextBlock>
        </Border>
    </ControlTemplate>
    

    【讨论】:

    • 我对模板进行了一些调整,使其成为Style,如第一个示例所示。使用TemplateBinding 然后工作,谢谢!现在让它动态更新...
    • 如果我想使用相同的方法在文本块上设置一些文本,我该怎么办?
    【解决方案2】:

    如果您使用背景而不是边框​​颜色,它会起作用。 BorderColor 是您自己的财产吗?

    <Window.Resources>
    <ControlTemplate x:Key="template" TargetType="{x:Type ToggleButton}">
        <Border>
            <Border.BorderBrush>
                    <SolidColorBrush Color="{Binding Path=Background,RelativeSource={RelativeSource AncestorType=UserControl}}" />
            </Border.BorderBrush>
        </Border>
    </ControlTemplate>
    </Window.Resources>
    
    <UserControl Background="Aqua">
        <ToggleButton Template="{StaticResource template}"></ToggleButton>
    
    </UserControl>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多