WPF 用户控件的绑定问题

Binding issue with WPF user control

这就是我真正想要的。 UserControlTextBlockText 属性 绑定到 UserControlProp 属性。 (这只是我实际问题的代表)

下面是我的一部分 UserControl (ClientDetailsControl.xaml)

<TextBlock Text="{Binding Prop}" />

接下来是ClientDetailsControl.xaml.cs

public partial class ClientDetailsControl : UserControl
{
    public static DependencyProperty PropProperty = DependencyProperty.Register("Prop", typeof(String), typeof(ClientDetailsControl));
    public String Prop { get; set; }

    public ClientDetailsControl()
    {
        InitializeComponent();
        DataContext = this;
    }
}

现在,在我的主要 WPF window(NewOrder.xaml) 中,我将此 UserControl 用作

<userControl:ClientDetailsControl Prop="{Binding MyProp}" />

MyProp属性在NewOrder.xaml.cs

中声明如下
public String MyProp { get { return "HELLO"; } }

当我 运行 此代码时,出现以下错误:

BindingExpression path error: 'MyProp' property not found on 'object' ''ClientDetailsControl' (Name='')'. BindingExpression:Path=MyProp; DataItem='ClientDetailsControl' (Name=''); target element is 'ClientDetailsControl' (Name=''); target property is 'Prop' (type 'String')

当我简单地写

<userControl:ClientDetailsControl Prop="ABCD" />

有效。但是,当我尝试将 UserControlProp 属性 绑定到 MyProp 时,它不起作用。

我该怎么做?

像这样使用 RelativeSource 属性:

<userControl:ClientDetailsControl 
  Prop="{Binding MyProp,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}"/>

它不起作用的原因是绑定路径是相对于 DataContext,而不是(父)控件。

这就是为什么您可以通过设置 RelativeSource 来解决这个问题;在这种情况下,绑定路径使用 RelativeSource 作为查找 属性.

的起点

另一种解决方法是命名父级并设置绑定的 ElementName。

MVVM 方法是将 属性 添加到 ViewModel class,将父控件的 DataContext 设置为 ViewModel 的实例并将父控件和客户端控件绑定到属性.