我的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事件。
有人能说清楚我做错了吗?
答案 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
监听目标更新按预期工作。