2

我有一个奇怪的问题,我目前正在尝试设置 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 截屏

4

2 回答 2

1

通常当涉及到样式和触发器时,人们不知道优先级,即本地值完全覆盖样式。鉴于您没有在控件上设置任何属性,所有样式都应该可以工作。

因此,例如,如果您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");
        }
    }
}
于 2013-05-05T18:37:11.607 回答
0

我使用扩展的 WPF 工具包,但我没有SingleUpDown,但您可能谈论的版本可能与此不同:http ://wpftoolkit.codeplex.com/ 。我有DoubleUpDown,你的非功能性风格对我有用。

于 2013-05-05T18:25:20.413 回答