#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 недействителен.