为什么在WPF中我的Image Control没有SourceUpdated事件触发器?

时间:2010-09-27 18:25:43

标签: c# wpf .net-3.5

我的WPF项目中的窗口上有一个图像控件

XAML:

<Image 
  Source="{Binding NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}" 
  Binding.SourceUpdated="bgMovie_SourceUpdated" 
  Binding.TargetUpdated="bgMovie_TargetUpdated" />

在代码中我正在改变图像的来源

C#:

myImage = new BitmapImage();
myImage.BeginInit();
myImage.UriSource = new Uri(path);
myImage.EndInit();
this.bgMovie.Source = myImage;

但是永远不会触发bgMovie_SourceUpdated事件。

有人能说清楚我做错了吗?

3 个答案:

答案 0 :(得分:7)

通过直接为Source属性赋值,您可以“取消绑定”它......您的Image控件不再是数据绑定,只是具有本地值。

在4.0中,您可以使用SetCurrentValue方法:

this.bgMovie.SetCurrentValue(Image.SourceProperty, myImage);

不幸的是,这种方法在3.5中不可用,并且没有简单的替代方法......

无论如何,你到底想要做什么?如果你手动设置它,绑定Source属性有什么意义呢?如果要检测Source属性何时更改,可以使用DependencyPropertyDescriptor.AddValueChanged方法:

var prop = DependencyPropertyDescriptor.FromProperty(Image.SourceProperty, typeof(Image));
prop.AddValueChanged(this.bgMovie, SourceChangedHandler);
...

void SourceChangedHandler(object sender, EventArgs e)
{

}

答案 1 :(得分:3)

通过对代码中的Source进行硬编码,您将破坏XAML中的Binding。

而不是这样做,绑定到您使用(大部分)上面相同代码设置的属性。这是一种方法。

XAML:

<Image Name="bgMovie" 
       Source="{Binding MovieImageSource, 
                        NotifyOnSourceUpdated=True, 
                        NotifyOnTargetUpdated=True}"
       Binding.SourceUpdated="bgMovie_SourceUpdated" 
       Binding.TargetUpdated="bgMovie_TargetUpdated" />

C#:

    public ImageSource MovieImageSource
    {
        get { return mMovieImageSource; }
        // Set property sets the property and implements INotifyPropertyChanged
        set { SetProperty("MovieImageSource", ref mMovieImageSource, value); }
    }

   void SetMovieSource(string path)
   {
        myImage = new BitmapImage();
        myImage.BeginInit();
        myImage.UriSource = new Uri(path);
        myImage.EndInit();
        this.MovieImageSource = myImage;
   }

答案 2 :(得分:0)

与标题相关,但不是解决方案:

https://msdn.microsoft.com/en-us/library/system.windows.data.binding.targetupdated(v=vs.100).aspx指出您需要添加NotifyOnTargetUpdated(或NotifyOnSourceUpdated):

Text="{Binding Path=Rent, Mode=OneWay, NotifyOnTargetUpdated=True}"

在我添加之后,我的EventTrigger监听目标更新按预期工作。