在属性更改时有选择地/有条件地更新绑定到相同模型属性的控件

时间:2012-08-09 15:36:56

标签: c# wpf silverlight xaml

下面我有两个控件模板,用作网格中两个不同列的单元格模板。您会注意到两个列都绑定到相同的模型属性(代码和值),但使用转换器以不同方式显示这些值。两个控件模板也使用相同的样式在数据更改时“闪​​烁”单元格。

这有效,但不完全是我想要的方式。现在,当Data.Code或Data.Value更改时,BOTH列单元格闪烁。我想要的是如果Data.Code ==“CodeA”,那么使用模板CDisplay2的列不应该闪烁(事实上,它不应该显示任何内容)。如果Data.Code ==“CodeB”,那么使用模板CDisplay1的单元格不应该闪烁。

要实现这一点,如果我可以有条件地应用基于Data.Code的样式模板,那将是很好的,但我无法弄清楚如何做到这一点。对此有何看法?如何根据特定属性值有选择地将样式应用于绑定到同一模型属性的多个控件?

<Style x:Key="FlashStyle" TargetType="TextBlock" >
    <Setter Property="Visibility" Value="Collapsed"/>
    <Style.Triggers>
        <EventTrigger RoutedEvent="Binding.TargetUpdated">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames RepeatBehavior="4x" Storyboard.TargetProperty="(UIElement.Visibility)">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
                            <DiscreteObjectKeyFrame KeyTime="0:0:0.4" Value="{x:Static Visibility.Collapsed}"/>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Style.Triggers>
</Style>

<ControlTemplate x:Key="CDisplay1" >
    <Grid>
        <TextBlock Style="{StaticResource Flash1}" >
            <TextBlock.Text>
                <MultiBinding Converter="{StaticResource conv}"  ConverterParameter="CodeA" NotifyOnTargetUpdated="True">
                    <Binding Path="Data.Code"  />
                    <Binding Path="Data.Value"  />
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Grid>
</ControlTemplate>
<ControlTemplate x:Key="CDisplay2" >
    <Grid>
        <TextBlock Style="{StaticResource Flash1}" >
            <TextBlock.Text>
                <MultiBinding Converter="{StaticResource conv}"  ConverterParameter="CodeB" NotifyOnTargetUpdated="True">
                    <Binding Path="Data.Code"  />
                    <Binding Path="Data.Value"  />
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Grid>
</ControlTemplate>

1 个答案:

答案 0 :(得分:0)

我使用触发器有条件地设置绑定。这样做的结果是FlashStyle不会对两个控件都执行,因为某些单元格不会被绑定,并且不会调用转换器。