WPF DataTrigger上的任何数据(绑定)的变化 [英] WPF DataTrigger on any data (binding) change

查看:109
本文介绍了WPF DataTrigger上的任何数据(绑定)的变化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要开始一个故事板,每次我的图片来源变化。
我已经实现INotifyPropertyChanged的。

谁能帮我实现这一目标?

谢谢,

 <图像NAME =图片的Horizo​​ntalAlignment =中心VerticalAlignment =中心来源={绑定的ElementName = UC,路径=图片}>
        < Image.Resources>
            <情节提要X:键=picStoryX:NAME =picStory>
                < D​​oubleAnimation是
                Storyboard.TargetProperty=\"(Image.RenderTransform).(TransformGroup.Children)[0].(RotateTransform.Angle)\"
                从=0要=20工作持续时间=0:0:0.7/>
                < D​​oubleAnimation是Storyboard.TargetProperty=\"(Image.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)\"从=100为了=0时长=0:0:0.7/>
            < /故事板>
        < /Image.Resources>
        < Image.Style>
            <风格的TargetType ={X:输入图像}支持算法FMP ={StaticResource的{X:输入图像}}>
                < Style.Triggers>
                    < D​​ataTrigger绑定={绑定路径=源}>
                        < D​​ataTrigger.EnterActions>
                            < BeginStoryboard故事板={StaticResource的picStory}/>
                        < /DataTrigger.EnterActions>
                    < / DataTrigger>
                < /Style.Triggers>
            < /样式和GT;
        < /Image.Style>
        < Image.RenderTransform>
            <&的TransformGroup GT;
                < RotateTransform />
                < TranslateTransform />
            < /&的TransformGroup GT;
        < /Image.RenderTransform>
    < /图像>

code绑定到UC

 私人BitmapImage的形象;
        公众形象的BitmapImage
        {
            {返回形象; }
            组
            {
                图像=价值;
                OnPropertyChanged(图像);
            }
        }        公共事件PropertyChangedEventHandler的PropertyChanged;
        保护无效OnPropertyChanged(字符串propertyName的)
        {
            如果(!=的PropertyChanged空)的PropertyChanged(这一点,新System.ComponentModel.PropertyChangedEventArgs(propertyName的));
        }


解决方案

您可以通过建立一个非常基本的自定义的控制,从图像会继承另一种简单的方式实现这一目标。

在这里,code为MYIMAGE

 公共类MYIMAGE:图片
{
    公共静态只读RoutedEvent ImageUpdatedEvent =
       EventManager.RegisterRoutedEvent(ImageUpdated,RoutingStrategy.Bubble的typeof(RoutedEventHandler)的typeof(MYIMAGE));    公共事件RoutedEventHandler ImageUpdated
    {
        添加{this.AddHandler(ImageUpdatedEvent,值); }
        除去{this.RemoveHandler(ImageUpdatedEvent,值); }
    }    公共静态只读的DependencyProperty MyImageSourceProperty = DependencyProperty.Register(
        MyImageSource
        typeof运算(的ImageSource)
        typeof运算(MYIMAGE)
        新PropertyMetadata(空,新PropertyChangedCallback(OnMyImageSourceChanged)));    公众的ImageSource MyImageSource
    {
        {返回(ImageSource的)的GetValue(MyImageSourceProperty); }
        组
        {
            来源=价值;
            的SetValue(MyImageSourceProperty,值);
        }
    }    私有静态无效OnMyImageSourceChanged(OBJ的DependencyObject,DependencyPropertyChangedEventArgs参数)
    {
        MYIMAGE IMG = OBJ为MYIMAGE;
        img.Source = args.NewValue为ImageSource的;
        img.RaiseEvent(新RoutedEventArgs(ImageUpdatedEvent));
    }
}

该MYIMAGE控制有它自己的图像源属性和名为ImageUpdated一个自己的路由事件,这将导致以后的故事板被triggerd。我已经简化了您的图像code:

 <按钮点击=Button_ClickGrid.Row =0>通过视图模型&LT设置图像; /按钮>    <局部:MYIMAGE Grid.Row =1×:NAME =PICMyImageSource ={结合MYSOURCE}>
        < Image.Triggers>
            <的EventTrigger RoutedEvent =本地:MyImage.ImageUpdated>
                < BeginStoryboard>
                    <情节提要>
                        &所述; DoubleAnimation是Storyboard.TargetProperty =(Image.Opacity)从=0要=1持续时间=0:0:1/>
                    < /故事板>
                < / BeginStoryboard>
            < /&的EventTrigger GT;
        < /Image.Triggers>
    < /地方:MYIMAGE>

按钮设置绑定视图模型的图像源属性,它实现INotifyPropertyChanged一个新值:

 私人无效Button_Click(对象发件人,RoutedEventArgs E)
    {
        INT randomValue =新随机(DateTime.Now.Second)。接下来(0,2);        如果(randomValue == 0)
        {
            _viewModel.MySource =新的BitmapImage(新的URI(@TEST.BMP,UriKind.Relative));
        }
        其他
        {
            _viewModel.MySource =新的BitmapImage(新的URI(@test2.bmp,UriKind.Relative));
        }
    }

在视图模型的二传手更新MYIMAGE财产变模式:

 公开的ImageSource MYSOURCE
    {
        {返回_mySource; }
        组
        {
            _mySource =价值;
            RaisePropertyChanged(MYSOURCE);
        }
    }

在我的例子,不透明度属性动画。

希望这是有帮助的。

I want to begin a storyboard, every time my Image source changes. I have implemented INotifyPropertyChanged.

Can anyone help me achieve this?

Thanks,

<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>

Code bound to "uc":

        private BitmapImage image;
        public BitmapImage Image
        {
            get { return image; }
            set
            {
                image = value;
                OnPropertyChanged("Image");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null) PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }

解决方案

you can achieve this in another simple way by building a very basic custom control, which inherits from Image.

Here the code for "MyImage":

public class MyImage : Image
{
    public static readonly RoutedEvent ImageUpdatedEvent =
       EventManager.RegisterRoutedEvent("ImageUpdated", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyImage));

    public event RoutedEventHandler ImageUpdated
    {
        add { this.AddHandler(ImageUpdatedEvent, value); }
        remove { this.RemoveHandler(ImageUpdatedEvent, value); }
    }

    public static readonly DependencyProperty MyImageSourceProperty = DependencyProperty.Register(
        "MyImageSource",
        typeof(ImageSource),
        typeof(MyImage),
        new PropertyMetadata(null, new PropertyChangedCallback(OnMyImageSourceChanged)));

    public ImageSource MyImageSource
    {
        get { return (ImageSource)GetValue(MyImageSourceProperty); }
        set
        {
            Source = value;
            SetValue(MyImageSourceProperty, value);
        }
    }

    private static void OnMyImageSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        MyImage img = obj as MyImage;
        img.Source = args.NewValue as ImageSource;
        img.RaiseEvent(new RoutedEventArgs(ImageUpdatedEvent));
    }
}

The MyImage control has it's own image source property and an own routed event called "ImageUpdated", which will later cause the storyboard to be triggerd. I have simplified your image code:

<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>

The button sets a new value for the image source property of the bound viewmodel, which implements INotifyPropertyChanged:

 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));
        }
    }

The setter in the viewmodel updates the MyImage with property changed pattern:

public ImageSource MySource
    {
        get { return _mySource; }
        set
        {
            _mySource = value;
            RaisePropertyChanged("MySource");
        }
    }

In my example, the opacity property is animated.

Hope this was helpful

Jan

这篇关于WPF DataTrigger上的任何数据(绑定)的变化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆