Как привязать источник изображения к вложенному свойству?

#c# #.net #wpf

#c# #.net #wpf

Вопрос:

Я создал пользовательский элемент управления, который содержит элемент управления изображением.

Я бы хотел, чтобы источник элемента управления изображением был привязан к свойству зависимости ImageSource.

Свойство зависимости создается как таковое:

 public static class ImageSourceProperty
{
    public static readonly DependencyProperty CustomImageSourceProperty;

    public static ImageSource GetCustomImageSource(DependencyObject dependencyObject)
    {
        return (ImageSource)dependencyObject.GetValue(CustomImageSourceProperty);
    }

    public static void SetCustomImageSource(DependencyObject dependencyObject, ImageSource value)
    {
        dependencyObject.SetValue(CustomImageSourceProperty, value);
    }

    static ImageSourceProperty()
    {
        CustomImageSourceProperty = DependencyProperty.RegisterAttached("CustomImageSource", typeof (ImageSource), typeof (ImageSourceProperty), new PropertyMetadata(default(ImageSource)));
    }
}
  

И я пытаюсь привязать источник изображения к пользовательскому элементу управления как таковому:

 <UserControl
(...)
xmlns:AttachedProperties="clr-namespace:Codex.UserControls.AttachedProperties"
x:Class="Codex.UserControls.CustomControls.ImageWithBorder"
d:DesignWidth="640" d:DesignHeight="480">

<Grid x:Name="LayoutRoot">
    <Border BorderBrush="White" BorderThickness="3" CornerRadius="3">
        <Image Source="{Binding AttachedProperties:ImageSourceProperty.CustomImageSource}" Width="50" Height="50"/>
    </Border>
</Grid>
  

Я разместил пользовательский элемент управления в моем представлении следующим образом:

 <CustomControls:ImageWithBorder (...) AttachedProperties:ImageSourceProperty.CustomImageSource="(...)"/>
  

Я получаю следующую ошибку в окне вывода при запуске приложения:

 System.Windows.Data Error: 40 : BindingExpression path error: 'AttachedProperties:ImageSourceProperty' property not found on 'object' ''ToolbarViewModel' (HashCode=20169503)'. 
  

Почему пользовательский элемент управления не может привязываться к свойству зависимости? Он ищет свойство зависимости в своем коде и не может его найти?

Комментарии:

1. Почему вы используете вложенное свойство вместо обычного свойства зависимости?

2. Я думал об использовании этого свойства в других пользовательских элементах управления, которым может потребоваться привязать источник элементов управления изображениями к свойству зависимостей. Должен ли я просто использовать обычное свойство зависимости в каждом пользовательском элементе управления, которому, возможно, потребуется такая привязка …?

3. Я попробовал это со свойством зависимости, и все работает. Как мне привязаться к вложенному свойству? Я хотел бы иметь возможность повторно использовать свойство Dependency с другими пользовательскими элементами управления.

Ответ №1:

Обнаружена проблема. Я не указывал относительный источник привязки.

Вот правильное объявление UserControl:

 <Image Source="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type CustomControls:ImageWithBorder}},Path=(AttachedProperties:ImageSourceProperty.CustomImageSource), Mode=TwoWay}" Width="50" Height="50"/>
  

Проблема заключалась в том, что свойство Dependency не смогло вернуть значение, поскольку объект dependency недействителен.