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 шт):

Автор решения: vitidev

Все дело в

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}}}"/>
→ Ссылка