样式优先于绑定

时间:2014-05-28 11:12:28

标签: c# wpf

在我的示例中,无论我如何为控件中的行为定义样式,它都只获取绑定属性中定义的样式。例:

    <Style TargetType="Border">
        <Setter Property="BorderBrush" Value="Gray"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Style.Triggers>
            <Trigger Property="Border.IsMouseOver" Value="True">
                <Setter Property="Background" Value="Yellow"/>                    
            </Trigger>
        </Style.Triggers>
    </Style>

    ....

    <Border Background="{Binding UserColor}">

当鼠标过度控制时,背景不会变黄。

2 个答案:

答案 0 :(得分:1)

这是正确的行为。删除直接分配并为您的样式添加一个setter:

<Style TargetType="Border">
    <Setter Property="BorderBrush" Value="Gray"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Background" Value="{Binding UserColor}"/>
    <Style.Triggers>
        <Trigger Property="Border.IsMouseOver" Value="True">
            <Setter Property="Background" Value="Yellow"/>                    
        </Trigger>
    </Style.Triggers>
</Style> 

答案 1 :(得分:0)

Control.Background属性是DependencyPropertyDependencyProperty可以从各种来源设置,例如。 Style SetterAnimation,来自代码等。由于这个原因,Microsoft必须定义优先顺序,以决定更改DependencyProperty值的哪些方法更重要其他

逻辑上决定使用内联XAML设置DependencyProperty,就像在示例中一样,应该“覆盖”从其他来源设置的值,例如。来自Style。这就是您的Background Style未在您的示例中显示的原因。有关DependencyProperty值优先级列表的完整信息,请参阅MSDN上的Dependency Property Value Precedence页面。


更新&gt;&gt;&gt;

请注意,如果您想为Background设置默认的Border颜色,那么您应该在使用过的Style内联中声明它,因为我们已经知道这不起作用:

<Style TargetType="Border">
    <Setter Property="BorderBrush" Value="Gray"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Background" Value="{Binding UserColor}"/> <!-- Default -->
    <Style.Triggers>
        <Trigger Property="Border.IsMouseOver" Value="True">
            <Setter Property="Background" Value="Yellow"/>                    
        </Trigger>
    </Style.Triggers>
</Style>