Binding.TargetUpdated在初始表单加载后未触发

时间:2012-08-08 16:23:51

标签: c# wpf xaml

下面我有一个控制模板,包含两个文本框。控件模板用作网格的单元格显示模板,datacontext是我的模型对象的绑定列表(实现INotifyPropertyChanged)。第二个文本框最初是Collapsed。但是,当“询问”和“出价”价格更新发生时,我希望通过将可见性切换大约1秒来“闪烁”此文本框。

我看到的问题是,在表单的初始加载时,我确实看到第二个文本框闪烁,但之后......没有。有趣的是,如果我单击一个单元格网格(激活编辑模板),然后单击单元格(恢复显示模板,这是下面显示的模板),第二个文本框然后闪烁。

当AskPrice或BidPrice发生变化时,有人会发现为什么第二个文本框不会“闪烁”的问题?我确实看到转换器正在按预期调用,但更新不会触发故事板动画。

<Style x:Key="PriceSpreadAlertStyle" TargetType="TextBlock">
    <Setter Property="Visibility" Value="Collapsed" />
    <Setter Property="Background" Value="Red" />
    <Style.Triggers>
        <EventTrigger RoutedEvent="Binding.TargetUpdated" >
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.Visibility)">
                            <DiscreteObjectKeyFrame KeyTime="00:00:00.2" Value="{x:Static Visibility.Visible}"/>
                            <DiscreteObjectKeyFrame KeyTime="00:00:00.4" Value="{x:Static Visibility.Collapsed}"/>
                            <DiscreteObjectKeyFrame KeyTime="00:00:00.6" Value="{x:Static Visibility.Visible}"/>
                            <DiscreteObjectKeyFrame KeyTime="00:00:00.8" Value="{x:Static Visibility.Collapsed}"/>
                            <DiscreteObjectKeyFrame KeyTime="00:00:01.0" Value="{x:Static Visibility.Visible}"/>
                            <DiscreteObjectKeyFrame KeyTime="00:00:01.2" Value="{x:Static Visibility.Collapsed}"/>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Style.Triggers>
</Style>

<ControlTemplate x:Key="QuoteDisplayTemplate" >
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding QuotePrice}" />
        <TextBlock Style="{StaticResource PriceSpreadAlertStyle}">
          <TextBlock.Text>
            <MultiBinding Converter="{StaticResource AskBidToSpreadConverter}">
              <Binding Path="AskPrice" UpdateSourceTrigger="PropertyChanged" NotifyOnTargetUpdated="True" />
              <Binding Path="BidPrice" UpdateSourceTrigger="PropertyChanged" NotifyOnTargetUpdated="True" />
            </MultiBinding>
          </TextBlock.Text>
        </TextBlock>
    </StackPanel>
</ControlTemplate>

2 个答案:

答案 0 :(得分:1)

在执行NotifyPropertyChanged时,检查其代码中的“获取”值。

出于同样的原因,请在最初启动时检查是否存在任何绑定表达式错误。

此外,您可以尝试将绑定模式更改为单向,我不这么认为,但它们可能会被设置为一次性绑定,从而阻止它处理已更改的事件。

编辑: 您是否尝试过使用SourceUpdated RoutedEvent而不是TargetUpdated?

答案 1 :(得分:1)

我找到的解决方案是移动&#39; NotifyOnTargetUpdated =&#34; True&#34;&#39;从Binding元素到MultiBinding元素。