В настоящее время я пишу элемент управления для просмотра изображений, который инкапсулирует 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