Почему у Multibinding есть свойство NotifyOnTargetUpdated, но нет свойства TargetUpdated - PullRequest
2 голосов
/ 24 июля 2010

Я столкнулся с проблемой, когда событие TargetUpdated казалось идеальным.К сожалению, похоже, что Multibinding не имеет свойства 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
}

И я хочу получить это результирующее число и передать его функции для обновления угла / анимации.

    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.

1 Ответ

2 голосов
/ 24 июля 2010

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>

ОБНОВЛЕНИЕ: На самом деле приведенное выше решение не работает, поскольку 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событие аргументирует, чтобы проверить, является ли это вращением

...