2010-07-23 74 views
2

我遇到了TargetUpdated事件看起来像是完美的问题。不幸的是,它看起来像Multibinding没有TargetUpdated属性。有没有办法设置这个或者我需要完全找到另一个解决方案。为什么Multibinding具有NotifyOnTargetUpdated,但没有TargetUpdated属性

继承人一些代码,以帮助

继承人的结合...

<RotateTransform x:Name="LeftNeedle"> 
<RotateTransform.Angle> 
    <MultiBinding Converter="{StaticResource VoltageRatioConverter}" NotifyOnTargetUpdated="True" > 
     <Binding ElementName="root" Path="Running" /> 
     <Binding ElementName="root" Path="Incoming" /> 
    </MultiBinding> 
</RotateTransform.Angle> 

然后我有值转换器...

public class VoltageRatioConverter : IMultiValueConverter 
{ 
    #region IMultiValueConverter Members 

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (values == null || values.Count((x) => x != null) != 2) 
      return 0.0; 

     double running = System.Convert.ToDouble(values[0]); 
     double incoming = System.Convert.ToDouble(values[1]); 

     return ((running/incoming) - 1); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

什么我m想要做的是检索结果数字,并将其传递给一个函数来更新角度/动画

private static void OnAngleValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     GaugeCluster gauge = o as GaugeCluster; 
     if ((double)e.NewValue > 70) 
     { 
      VisualStateManager.GoToState(gauge, "RightWobble", false); 
     } 
     else if ((double)e.NewValue < -70) 
     { 
      VisualStateManager.GoToState(gauge, "LeftWobble", false); 
     } 
     else 
     { 
      if ((double)e.OldValue > 70 || (double)e.OldValue < -70) 
      { 
       VisualStateManager.GoToState(gauge, "StandingState", false); 
      } 
     } 
    } 

^这个功能,我只是测试,以确保它实际上是通过使从两个依赖属性中的一个回调的工作。理想情况下,函数体是我想在TargetUpdated事件上使用的。

+0

如果在MultiBinding中的某个单独绑定上设置了TargetUpdated,那么这足够了吗? – Goblin 2010-07-23 22:47:35

+0

否,因为决定动画的值来自多变换器对这两个值都变化的乘积。 – 2010-07-26 17:19:24

回答

2

TargetUpdated是附加事件。您注册在绑定目标这一事件,而不是结合自身:

<RotateTransform x:Name="LeftNeedle" Binding.TargetUpdated="LeftNeedle_TargetUpdated"> 
    <RotateTransform.Angle> 
     <MultiBinding Converter="{StaticResource VoltageRatioConverter}" NotifyOnTargetUpdated="True" > 
      <Binding ElementName="root" Path="Running" /> 
      <Binding ElementName="root" Path="Incoming" /> 
     </MultiBinding> 
    </RotateTransform.Angle> 
</RotateTransform> 

UPDATE:其实上面的解决方案不起作用,因为RotateTransform不是UIElement ......你需要处理Binding.TargetUpdated其所采用的UIElement事件:

<Rectangle Fill="Blue" Width="30" Height="30" 
      Binding.TargetUpdated="LeftNeedle_TargetUpdated"> 
    <Rectangle.RenderTransform> 
    <RotateTransform x:Name="LeftNeedle"> 
     <RotateTransform.Angle> 
      <MultiBinding Converter="{StaticResource VoltageRatioConverter}" NotifyOnTargetUpdated="True" > 
       <Binding ElementName="root" Path="Running" /> 
       <Binding ElementName="root" Path="Incoming" /> 
      </MultiBinding> 
     </RotateTransform.Angle> 
    </RotateTransform> 
    </Rectangle.RenderTransform> 
</Rectangle /> 

本次活动将泡沫到Rectangle,你可以检查事件参数的TargetObject属性来检查它是否是个e rotation

+0

我给你的解决方案尝试,似乎它应该工作,但我得到错误“LeftNeedle_TargetUpdated”无效。 “TargetUpdated”不是“System.Windows.Media.RotateTransform”上的事件。 有什么建议吗?谢谢 – 2010-07-26 17:18:11

+0

事实上,这是行不通的......看我更新的答案 – 2010-07-26 17:57:10

+0

谢谢我正在试验这个,但不知道它是否正常工作,它是做什么的。在这一点上,我意识到整个设置并不按我期望的方式工作。即使更新了角度,状态也会继续下去,所以它们都会根据先到达哪个极限而陷入某种循环。 – 2010-07-26 19:36:56

相关问题