我目前正在编写一个图像查看器控件,它封装了WPF图像控件和其他内容(用于应用过滤器和更改视图的控件)。这是控件源代码的相关部分:
public partial class ImageViewPort : UserControl, INotifyPropertyChanged
{
private BitmapSource _source;
public static readonly DependencyProperty ImageDescriptorSourceProperty =
DependencyProperty.Register("ImageDescriptorSource",
typeof(ImageDescriptor),
typeof(ImageViewPort),
new UIPropertyMetadata(ImageDescriptorSourceChanged));
public ImageDescriptor ImageDescriptorSource
{
get { return (ImageDescriptor)GetValue(ImageDescriptorSourceProperty); }
set { SetValue(ImageDescriptorSourceProperty, value); }
}
public BitmapSource Source //the image control binds to this beauty!
{
get { return _source; }
set { _source = value; OnPropertyChanged("Source"); }
}
public ImageViewPort() { InitializeComponent(); }
private static void ImageDescriptorSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ImageViewPort viewPort = (ImageViewPort)d;
if (viewPort != null)
{
viewPort.TransformImage();
}
}
private BitmapSource TransformImage()
{
//do something that sets the "Source" property to a BitmapSource
}
}
用户控件的XAML代码(仅相关部分):
<UserControl x:Name="viewPort">
<Image Source="{Binding ElementName=viewPort,Path=Source}"/>
</UserControl>
最后用法:
<WPF:ImageViewPort ImageDescriptorSource="{Binding Path=CurrentImage}"/>
在我的窗口中,我基本上迭代了一个Collection,并且在我这样做时,为CurrentImage属性抛出PropertyChanged通知。这样做,每次调用getter,所以绑定似乎有效。
我现在期望发生的是我的UserControl的PropertyChanged-Callback被触发,但是没有发生这样的事情(它从未进入过,我尝试过使用断点)。我尝试过绑定一个原始类型(int)的相同的东西,并且有效。
你看到我的实施中有任何缺陷吗?为什么用户控件没有更新? 非常感谢您的任何帮助!
干杯
塞比
答案 0 :(得分:1)
检查输出...你有任何绑定警告吗?你也设置了一个新值? WPF知道您何时尝试设置已设置的值并忽略它。我建议将元数据类型转换为FrameworkPropertyMetadata并提供适当的默认值。
为此“注释”赋予更多价值:在绑定上添加“PresentationTraceSources.TraceLevel = High”会提供有关绑定如何尝试获取其值的更多信息,这也有助于找到不是WPF错误的问题
<TextBox Text="{Binding MyText, PresentationTraceSources.TraceLevel=High}"/>