2010-07-23 13 views
2

TargetUpdated 이벤트가 이상적인 것처럼 보이는 문제가 발생했습니다. 불행히도 Multibinding에는 TargetUpdated 속성이 없습니다. 여전히이 문제를 해결할 수있는 방법이 있습니까? 아니면 완전히 다른 솔루션을 찾아야 할 필요가 있습니까? Multibinding에 NotifyOnTargetUpdated가 있지만 TargetUpdated 속성이 없습니다.

Heres는 일부 코드는 ...

<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 
} 

바인딩을 Heres

에 도움이 그리고 내가 뭘 ' 찾고있는 숫자를 가져 와서 각도/애니메이션을 업데이트하는 함수에 전달합니다.

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

+0

아니요 애니메이션을 결정하는 값은 둘 다 변경되는 두 값에 대한 다중 변환기의 곱에서 비롯됩니다. –

답변

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> 

이 업데이트 : RotateTransformUIElement하지 않기 때문에 실제로 위의 솔루션이 작동하지 않습니다 ... 당신은 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 속성을 확인할 수있는 것이 일 경우 전자 순환

+0

나는 당신의 솔루션에 효과가있는 것 같은 시도를했지만, "LeftNeedle_TargetUpdated"오류가 발생했습니다. "TargetUpdated"는 'System.Windows.Media.RotateTransform'의 이벤트가 아닙니다. 제안 사항이 있으십니까? 감사합니다 –

+0

실제로,이 작동하지 않습니다 ... 내 업데이트 된 대답을 참조 –

+0

고마워요 내가 실험하고 있었지만 그것이 제대로 작동했다면 확실하지 않았습니다. 나는이 모든 설정이 예상대로 작동하지 않는다는 것을 깨달았다. 앵글이 업데이트 되더라도 상태는 계속 진행되므로 어떤 극단에 먼저 도달했는지에 따라 일종의 루프에 빠지게됩니다. –

관련 문제