WPF - 多层的正确绑定方法是什么?

WPF - What is the proper binding method for multiple layers?

我研究这个问题已经有一段时间了,我想知道正确的方法。我想制作属性可以绑定到的可重用控件,然后在从另一个源更新绑定 属性 时更新控件本身。

这是一种布局;

我有一个实现了视图模型 (View Model X) 的页面(我们可以称之为页面 X)。 View Model X中有一个属性(布尔类型的Real属性X)。

我有一个用户控件,它是一个带有视图和视图模型的滑动复选框。

视图有依赖项属性:

public bool ValueChecked
    {
        get { return (bool)GetValue(ValueCheckedProperty); }
        set { SetValue(ValueCheckedProperty, value); }
    }

    public static readonly DependencyProperty ValueCheckedProperty =
        DependencyProperty.Register("ValueChecked", typeof(bool), typeof(SliderCheckbox),
            new PropertyMetadata(false));

视图模型将可绑定 属性 实现到我的用户控件的视图:

private bool _valueChecked;

    public bool ValueChecked
    {
        get { return _valueChecked; }
        set
        {
            _valueChecked = value;
            OnPropertyChanged(nameof(ValueChecked));
        }
    }

在我的 SliderUserControl 中

<CheckBox ... IsChecked="{Binding ValueChecked}"/>

在我的页面 X 视图中

<controls:SliderCheckbox ValueChecked="{Binding RealPropertyX, Mode=TwoWay}"/>

如果我的想法是正确的,那么从我的应用程序视图中,我将绑定到我的用户控制视图上的依赖项 属性。用户控件本身绑定到视图模型中的 属性。但是我如何 link 这两个正确地让他们都传达相同的价值?

一般来说,UserControl 不应绑定到特定的视图模型。它通常从父元素继承其 DataContext,这意味着您可以根据上下文将其依赖属性绑定到多个不同的视图模型:

<local:UserControl1 SomeProperty="{Binding SomeSourceProperty}" />

要将 UserControl 的 XAML 标记中的控件绑定到代码隐藏中定义的它自己的任何依赖属性,您可以使用相对源:

<CheckBox ... IsChecked="{Binding ValueChecked,
    RelativeSource={RelativeSource AncestorType=UserControl}}" />