具有自定义类型依赖项属性的用户控件(Bound)

时间:2012-01-17 12:09:07

标签: wpf data-binding user-controls dependency-properties

我目前正在编写一个图像查看器控件,它封装了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)的相同的东西,并且有效。

你看到我的实施中有任何缺陷吗?为什么用户控件没有更新? 非常感谢您的任何帮助!

干杯

塞比

1 个答案:

答案 0 :(得分:1)

检查输出...你有任何绑定警告吗?你也设置了一个新值? WPF知道您何时尝试设置已设置的值并忽略它。我建议将元数据类型转换为FrameworkPropertyMetadata并提供适当的默认值。

为此“注释”赋予更多价值:在绑定上添加“PresentationTraceSources.TraceLevel = High”会提供有关绑定如何尝试获取其值的更多信息,这也有助于找到不是WPF错误的问题

<TextBox Text="{Binding MyText, PresentationTraceSources.TraceLevel=High}"/>