在WPF中使用Trigger设置对象属性

时间:2013-05-05 16:59:33

标签: c# wpf xaml triggers styles

我有一个奇怪的问题,我正在尝试设置SingleUpDown控件的样式(来自Extended WPF Toolkit)

这是工作的当前风格:

<xctk:SingleUpDown>
    <xctk:SingleUpDown.Style>
        <Style TargetType="xctk:SingleUpDown">    
            <Style.Triggers>
                <DataTrigger Binding="{Binding _ThresoldLocked}" Value="True">
                    <Setter Property="Value" Value="2"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </xctk:SingleUpDown.Style>
</xctk:SingleUpDown>

虽然这两个例子像魅力一样:

<xctk:SingleUpDown>
    <xctk:SingleUpDown.Style>
        <Style TargetType="xctk:SingleUpDown">    
            <Style.Triggers>
                <DataTrigger Binding="{Binding _ThresoldLocked}" Value="True">
                    <Setter Property="Background" Value="Red"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </xctk:SingleUpDown.Style>
</xctk:SingleUpDown>

或者

<xctk:SingleUpDown>
    <xctk:SingleUpDown.Style>
        <Style TargetType="xctk:SingleUpDown">    
            <Setter Property="Value" Value="2"/>
        </Style>
    </xctk:SingleUpDown.Style>
</xctk:SingleUpDown>

第一种风格我做错了什么? 输出窗口中没有错误..

编辑: 这是我极简主义的例子: http://i.stack.imgur.com/EzxBP.png Screenshot

2 个答案:

答案 0 :(得分:1)

通常,当涉及到样式和触发器时,人们不了解precedence,即本地值等完全覆盖样式。鉴于您没有在控件上设置任何属性,所有样式应该工作。

例如,如果您在控件上设置Value<xctk:SingleUpDown Value="0">...),则触发器不会执行任何操作,您可以将默认值移至Setter

<xctk:SingleUpDown>
    <xctk:SingleUpDown.Style>
        <Style TargetType="xctk:SingleUpDown">
            <Setter Property="Value" Value="<default here>"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding _ThresoldLocked}" Value="True">
                    <Setter Property="Value" Value="2"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </xctk:SingleUpDown.Style>
</xctk:SingleUpDown>

修改

我对控件的行为进行了观察。如果您有如上所示的设置,则触发器将起作用,因此默认设置器在此处是必要的。

此外,您应该注意,操纵该值可能会在本地设置它,从而覆盖触发器的任何进一步影响。您可以通过使用动画而不是触发器来解决这个问题,因为它们具有最高优先级,但是这可能会使任何手动操作无效。

也许您应该将逻辑从UI移开,并将Value直接绑定到视图模型/模型上的属性,例如。

private bool _ThresholdLocked;
public bool ThresholdLocked
{
    get { return _ThresholdLocked; }
    set
    {
        if (value != _ThresholdLocked)
        {
            _ThresholdLocked= value;
            OnPropertyChanged("ThresholdLocked");
            OnPropertyChanged("Value"); //Value is also affected
        }
    }
}

private float _Value;
public float Value
{
    get
    {
        if (ThresholdLocked)
            return 2.0f;

        return _Value;
    }
    set
    {
        if (value != _Value)
        {
            _Value = value;
            OnPropertyChanged("Value");
        }
    }
}

答案 1 :(得分:0)

我使用的是Extended WPF Toolkit,但我没有SingleUpDown,但您可能正在讨论的不同版本是:http://wpftoolkit.codeplex.com/。我有DoubleUpDown,你的非功能风格适合我。