2010-07-23 73 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

相關問題