c# - 在 WPF 中使用触发器设置对象属性

标签 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>

我在第一个 Style 上做错了什么? 输出窗口没有错误..

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

最佳答案

通常当谈到样式和触发器时,人们并不知道 precedence ,即 local values 等完全覆盖样式。考虑到您没有在控件上设置任何属性,所有样式应该都可以工作。

例如,如果您设置 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>

编辑:

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

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

也许您应该将您的逻辑从 UI 移开并只绑定(bind) Value直接到您的 View 模型/模型上的属性,例如

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");
        }
    }
}

关于c# - 在 WPF 中使用触发器设置对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16386892/

相关文章:

c# - 如何从 WPF 表单中删除边框/控制框?

c# - WP7 - 文本框光标位置错误

c# - 将 C# .Net 加密/解密算法迁移到 Ruby

c# - 是否可以在未安装 .NET 或 XNA 的情况下运行 XNA 游戏?

c# - 在 WPF 中按下按钮后检测鼠标单击的最佳方法

c# - 如何设置 MahApps 窗口网格的样式?

c# - 自定义控件内的控件不可移动

c# - 如何使用 C# 在未安装 Microsoft Office 的情况下将 .xls 文件转换为 .xlsx?

c# - 在 Controller 中的每个方法中都有一个通用的 try/catch 是个好主意还是有更好的方法?

c# - 如何在 wpf 中获取多个项目的边界框?