【问题标题】:Why does Multibinding have NotifyOnTargetUpdated but no TargetUpdated property为什么多重绑定有 NotifyOnTargetUpdated 但没有 TargetUpdated 属性
【发布时间】:2010-07-23 22:43:35
【问题描述】:

我遇到了一个问题,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 事件上使用的。

【问题讨论】:

  • 如果在 MultiBinding 中的单个绑定之一上设置 TargetUpdated 就足够了吗?
  • 否,因为确定动画的值来自多转换器对这两个都在变化的值的乘积。

标签: wpf event-handling events multibinding


【解决方案1】:

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...您需要在应用它的UIElement 上处理Binding.TargetUpdated 事件:

<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,可以查看事件args的TargetObject属性判断是否是轮换

【讨论】:

  • 我尝试了您的解决方案,它似乎应该可以工作,但我收到错误“LeftNeedle_TargetUpdated”无效。 “TargetUpdated”不是“System.Windows.Media.RotateTransform”上的事件。有什么建议么?谢谢
  • 谢谢我正在尝试这个,但不确定它是否正常工作,确实如此。在这一点上,我已经意识到整个设置并没有按我预期的方式工作。即使角度更新,状态也会继续运行,因此它会陷入一种循环,具体取决于首先达到哪个极端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2012-12-11
  • 2017-06-14
相关资源
最近更新 更多