2013-05-05 129 views
2

我有一个奇怪的问题,我目前正在试图造型一SingleUpDown控制(从扩展WPF工具包)与触发设置对象属性WPF

这是当前的风格,做工作:

<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

+0

所有样式看起来像他们将工作(结合这些实例),你真的只使用代码所示? – 2013-05-05 18:38:28

+0

是的,我已经用截图更新了我的问题。 如果我按下“向上”或“向下”箭头,或者只是输入一个数字,它就可以正常工作。 – Jamby 2013-05-05 18:51:06

回答

0

我使用扩展WPF工具包,但我没有SingleUpDown那里,但你可能说话关于与此不同的版本是:http://wpftoolkit.codeplex.com/。我在那里DoubleUpDown和你的不起作用的风格适合我。

+0

不能。即使有DoubleUpDown我也无法得到它的工作..无论如何,SingleUpDown文档在这里找到:http://wpftoolkit.codeplex.com/wikipage?title=SingleUpDown – Jamby 2013-05-05 18:44:11

+0

是的。我也发现了这一点。但是,如果我明白了,它只是在付费版本?但奇怪的是,它适用于我而不适合你。 – Artholl 2013-05-05 18:48:55

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

我的xaml中没有设置Value属性.. – Jamby 2013-05-05 18:53:31

+0

@Jamby:查看我的答案的一些更改。我也认为控制是有点坏,这很容易为我知道的很多其他控件工作... – 2013-05-05 20:56:12

+0

@Jamby:顺便说一句,你的“阈值”似乎缺乏“h”。 – 2013-05-05 20:59:39