我有一个奇怪的问题,我目前正在尝试设置 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
最佳答案
通常当谈到样式和触发器时,人们并不知道 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/