任何数据(绑定)更改时的WPF数据触发器

任何数据(绑定)更改时的WPF数据触发器,wpf,binding,Wpf,Binding,每当我的图像源改变时,我想开始一个故事板。 我已实现INotifyPropertyChanged 有人能帮我做到这一点吗 谢谢 <Image Name="pic" HorizontalAlignment="Center" VerticalAlignment="Center" Source="{Binding ElementName=uc, Path=Image}"> <Image.Resources> <Storyboard

每当我的图像源改变时,我想开始一个故事板。 我已实现INotifyPropertyChanged

有人能帮我做到这一点吗

谢谢

<Image Name="pic" HorizontalAlignment="Center" VerticalAlignment="Center" Source="{Binding ElementName=uc, Path=Image}">
        <Image.Resources>
            <Storyboard x:Key="picStory" x:Name="picStory">
                <DoubleAnimation 
                Storyboard.TargetProperty="(Image.RenderTransform).(TransformGroup.Children)[0].(RotateTransform.Angle)"
                From="0" To="20" Duration="0:0:0.7" />
                <DoubleAnimation Storyboard.TargetProperty="(Image.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)" From="100" To="0" Duration="0:0:0.7" />
            </Storyboard>
        </Image.Resources>
        <Image.Style>
            <Style TargetType="{x:Type Image}" BasedOn="{StaticResource {x:Type Image}}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=Source}">
                        <DataTrigger.EnterActions>
                            <BeginStoryboard Storyboard="{StaticResource picStory}"/>
                        </DataTrigger.EnterActions>                            
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Image.Style>
        <Image.RenderTransform>
            <TransformGroup>
                <RotateTransform/>
                <TranslateTransform/>
            </TransformGroup>
        </Image.RenderTransform>  
    </Image>

您可以通过另一种简单的方式实现这一点,方法是构建一个非常基本的自定义控件,该控件继承自Image

这里是“MyImage”的代码:

MyImage控件有自己的image source属性和一个名为“ImageUpdated”的路由事件,该事件稍后将触发情节提要。我已简化了您的图像代码:

<Button Click="Button_Click" Grid.Row="0">Set Image through view model</Button>

    <local:MyImage Grid.Row="1"  x:Name="pic" MyImageSource="{Binding MySource}">
        <Image.Triggers>
            <EventTrigger RoutedEvent="local:MyImage.ImageUpdated">
                <BeginStoryboard >
                    <Storyboard >
                        <DoubleAnimation Storyboard.TargetProperty="(Image.Opacity)" From="0" To="1" Duration="0:0:1" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Image.Triggers>
    </local:MyImage>
viewmodel中的setter使用属性更改模式更新MyImage:

public ImageSource MySource
    {
        get { return _mySource; }
        set
        {
            _mySource = value;
            RaisePropertyChanged("MySource");
        }
    }
在我的示例中,“不透明度”属性已设置动画

希望这有帮助


Jan

您的DataTrigger中没有定义值标记

DataTrigger正在侦听更新以查找您在value标记中定义的值-因为您没有设置它-它默认为null(我猜您的图像永远不会为null)


如果您想让它在每次更改时都触发—只需在绑定标记中放置一个valueconverter,该标记始终返回True并设置Value=“True”。

您能否解释一下实现了
INotifyPropertyChanged
?您没有显示任何代码,并且您的图像源绑定到您正在显示的XAML之外的名为
uc
的东西。嗨,Jay,我已经添加了您请求的代码。但是这不是问题,我看到图像发生了变化,但是故事板没有被激活。你确定这会起作用吗?我试过了,很明显,如果值不变,触发器将不会触发-即,它会在第一次设置为True时触发,但不会在任何连续设置上触发。。。
<Button Click="Button_Click" Grid.Row="0">Set Image through view model</Button>

    <local:MyImage Grid.Row="1"  x:Name="pic" MyImageSource="{Binding MySource}">
        <Image.Triggers>
            <EventTrigger RoutedEvent="local:MyImage.ImageUpdated">
                <BeginStoryboard >
                    <Storyboard >
                        <DoubleAnimation Storyboard.TargetProperty="(Image.Opacity)" From="0" To="1" Duration="0:0:1" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Image.Triggers>
    </local:MyImage>
 private void Button_Click(object sender, RoutedEventArgs e)
    {
        int randomValue = new Random(DateTime.Now.Second).Next(0, 2);

        if (randomValue == 0)
        {
            _viewModel.MySource = new BitmapImage(new Uri(@"test.bmp", UriKind.Relative));
        }
        else
        {
            _viewModel.MySource = new BitmapImage(new Uri(@"test2.bmp", UriKind.Relative));
        }
    }
public ImageSource MySource
    {
        get { return _mySource; }
        set
        {
            _mySource = value;
            RaisePropertyChanged("MySource");
        }
    }