gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:42:48 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com