Как привязать само свойство элемента управления, а не свойство значения DataContext? - PullRequest
0 голосов
/ 08 июля 2019

У меня есть пользовательский элемент управления. С 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 элемента управления.

1 Ответ

0 голосов
/ 08 июля 2019

Попробуйте настроить метаданные свойства примерно так:

    public static readonly DependencyProperty ImageSizeProperty
      = DependencyProperty.Register(
        "ImageSize",
        typeof(double),
        typeof(WindowsProfilePicker),
        new FrameworkPropertyMetadata((double)126.0, 
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault
            | FrameworkPropertyMetadataOptions.AffectsRender
            | FrameworkPropertyMetadataOptions.AffectsMeasure)
    );

    [TypeConverter(typeof(LengthConverter))]
    public double ImageSize
    {
        get => (double)GetValue(ImageSizeProperty);
        set => SetValue(ImageSizeProperty, value);
    }

или

    public static readonly DependencyProperty ImageSizeProperty
      = DependencyProperty.Register(
        "ImageSize",
        typeof(double),
        typeof(WindowsProfilePicker),
        new FrameworkPropertyMetadata((double)126.0, 
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault
            | FrameworkPropertyMetadataOptions.AffectsRender
            | FrameworkPropertyMetadataOptions.AffectsMeasure)
    {
         BindsTwoWayByDefault = true,
         DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
     });

(AffectsRender & AffectsMeasure может и не понадобиться)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...