WPF|Avalonia Передать биндинг в UserControl
Есть юзерконтрол с ToggleSwitch (или CheckBox, не важно). Как я могу передать из основного окна в IsChecked юзерконтрола биндинг, чтобы в ToggleSwitch свойство IsChecked биндилось к нему? Следующий очевидный вариант не работает. Код Window.axaml:
<uc:ToggleBox IsChecked="{Binding MyViewModelProp}"/>
Код в ToggleBox.cs (в WPF может быть иначе):
private bool _isChecked;
public bool IsChecked
{
set => this.SetAndRaise(IsCheckedProperty, ref _isChecked, value);
get => _isChecked;
}
public static DirectProperty<ToggleBox, bool> IsCheckedProperty =
AvaloniaProperty.RegisterDirect<ToggleBox, bool>(
nameof(IsChecked),
o => o.IsChecked,
(o, v) => o.IsChecked = v);
Код в ToggleBox.axaml:
DataContext="{Binding RelativeSource={RelativeSource Self}}">
...
<ToggleSwitch IsChecked="{Binding IsChecked}"/>
Подобным образом я делал свойство Title, но передавал в него не биндинг, а статичный текст, и это работает. А вот с передачей биндинга проблемы. Контекст передается, я проверял.
Ответы (1 шт):
Все дело в
DataContext="{Binding RelativeSource={RelativeSource Self}}">
Он подменяет DataContext в месте вызова
<uc:ToggleBox IsChecked="{Binding MyViewModelProp}"/>
и поэтому он не может найти поле MyViewModelProp (что кстати видно в output логе)
Так что нельзя подменять DataContext внутри контрола, а следует делать примерно так
<ToggleSwitch IsChecked="{Binding IsChecked,
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"/>