C# WPF Convrter отрабатывает лишь 1 раз – при загрузке формы

У меня есть некоторый UIElement (в примере InkCanvas). Я хочу сохранять его размеры ActualHeigth и ActualWidth как только они меняются (происходит событие SizeChanged).

Свойства ActualHeigth и ActualWidth являются readonly, из-за чего я не могу использовать Binding. Вместо этого я решил написать команду, которая сохраняет во ViewModel данные поля.

В качестве параметра я не хочу передавать сам UIElement, так как это является нарушением паттерна MVVM. Я решил написать конвертер, который принимает InkCanvas и возвращает Size (его ActualHeigth и ActualWidth)

internal class FromInkCanvasToSizeConverter : MarkupExtension, IValueConverter
{
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is null)
        {
            throw new ArgumentNullException(nameof(value), $"Parameter \"{nameof(value)}\" is null.");
        }

        if (value is not InkCanvas inkCanvas)
        {
            throw new ArgumentException($"Parameter type is not \"{nameof(InkCanvas)}\"", nameof(value));
        }

        Size size = new(inkCanvas.ActualWidth, inkCanvas.ActualHeight);
        return size;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => DependencyProperty.UnsetValue;

    public override object ProvideValue(IServiceProvider serviceProvider) => this;
}

Для вызова команды при срабатывании события я использую Microsoft.Behaviors

<behaviors:Interaction.Triggers>
    <behaviors:EventTrigger EventName="SizeChanged">
        <behaviors:InvokeCommandAction Command="{Binding Path=SaveNewSizeCommand}"
                                       CommandParameter="{Binding Converter={converters:FromInkCanvasToSizeConverter},
                                                              RelativeSource={RelativeSource Mode=FindAncestor, 
                                                                                             AncestorType=InkCanvas}}"/>
    </behaviors:EventTrigger>
</behaviors:Interaction.Triggers>

Но что происходит в итоге: конвертер вызывается лишь 1 раз – когда создается View. Когда я меняю размеры InkCanvas, я попадаю в команду и она выполняется всегда, когда нужно (проверил дебаггером), но в нее попадает самое первое конвертированное значение (полученное во время загрузки View).

  • В чем проблема? Чего я не знаю про эти конвертеры?
  • Есть ли способ лаконичнее сохранять ActualHeigth и ActualWidth UI элемента?

Ответы (0 шт):