У меня есть пользовательский элемент управления. С XAML. У него есть свои свойства, объект ViewModel
установлен как DataContext:
<ComboBox ItemsSource="{Binding Items}" SelectedIndex="0">
<ComboBox.DataContext>
<vm:WindowsProfilePicker />
</ComboBox.DataContext>
Привязка к его свойствам значений DataContext очень проста и работает, как и ожидалось.
Допустим,
<Image Source="{Binding UserImage}" />
UserImage
является собственностью ViewModel
.
Элемент Image
, однако, является частью моего пользовательского элемента управления. Элемент управления имеет свое собственное свойство с именем ImageSize
, определенное следующим образом:
public static readonly DependencyProperty ImageSizeProperty
= DependencyProperty.Register(
"ImageSize",
typeof(double),
typeof(WindowsProfilePicker),
new FrameworkPropertyMetadata(126.0)
);
Конечно, у нас есть геттер и сеттер для него в коде:
public double ImageSize {
get => (double)GetValue(ImageSizeProperty);
set => SetValue(ImageSizeProperty, value);
}
Теперь я бы хотел сослаться на это свойство в XAML моего UserControl
. Это выглядит так:
<Image
Width="
{Binding RelativeSource={RelativeSource AncestorType=local:WindowsProfilePicker},
Path=ImageSize}"
Height="{Binding RelativeSource={RelativeSource AncestorType=local:WindowsProfilePicker},
Path=ImageSize}"
Source="{Binding UserImage}" />
Nice? Не совсем, и это не работает. Я не получаю ни ошибок, ни предупреждений, но размер изображения не установлен. Изображение в элементе управления устанавливает его размер из исходного размера растрового изображения. Когда я заменяю свою привязку на число, оно работает, размер фиксируется. Однако я хочу, чтобы свойство ImageSize
моего нового элемента управления использовалось как Image
Width
и Height
. Что я делаю не так?
Кстати, очевидно, я не хочу, чтобы свойство было связано с моей моделью представления, потому что это строго функция представления, не связанная с данными.
Визуальные объекты, такие как размеры, должны быть заданы в XAML (оптимально как стили), данные (в моем случае изображения профиля пользователя) в коде, ViewModel элемента управления.