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иActualWidthUI элемента?