пользовательский элемент управления со свойством зависимости типа (Bound) - PullRequest
0 голосов
/ 17 января 2012

В настоящее время я пишу элемент управления для просмотра изображений, который инкапсулирует WPF Image Control и другие элементы (элементы управления для применения фильтров и изменения видов). Вот соответствующая часть исходного кода элемента управления:

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 и при этом выкидываю уведомление PropertyChanged для свойства CurrentImage. Это работает, метод получения вызывается каждый раз, так что привязка, кажется, работает.

То, что я ожидал бы сейчас произойти, это то, что PropertyChanged-Callback моего UserControl запущен, но ничего подобного не происходит (он никогда не вмешивается, я пытался использовать точки останова). Я попробовал то же самое, связав примитивный тип (int), и это сработало.

Видите ли вы какой-либо недостаток в моей реализации? Почему пользовательский элемент управления не обновляется? Заранее большое спасибо за любую помощь!

Приветствия

Sebi

1 Ответ

1 голос
/ 17 января 2012

Проверьте вывод ... вы получаете какие-либо обязательные предупреждения? Также вы устанавливаете новое значение? WPF знает, когда вы пытаетесь установить значение, которое уже установлено, и игнорирует его. Я хотел бы предложить поблагодарить тип метаданных в FrameworkPropertyMetadata и указать правильное значение по умолчанию.

Чтобы придать этому «комментарию» больше значения: добавление «PresentationTraceSources.TraceLevel = High» в привязку дает много дополнительной информации о том, как привязка пытается получить свое значение, что также помогает, обнаруживая проблемы, которые не являются ошибками для WPF .

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