WPF 用户控件的绑定问题
Binding issue with WPF user control
这就是我真正想要的。
UserControl
和 TextBlock
的 Text
属性 绑定到 UserControl
的 Prop
属性。 (这只是我实际问题的代表)
下面是我的一部分 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" />
有效。但是,当我尝试将 UserControl
的 Prop
属性 绑定到 MyProp
时,它不起作用。
我该怎么做?
像这样使用 RelativeSource
属性:
<userControl:ClientDetailsControl
Prop="{Binding MyProp,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}"/>
它不起作用的原因是绑定路径是相对于 DataContext,而不是(父)控件。
这就是为什么您可以通过设置 RelativeSource 来解决这个问题;在这种情况下,绑定路径使用 RelativeSource 作为查找 属性.
的起点
另一种解决方法是命名父级并设置绑定的 ElementName。
MVVM 方法是将 属性 添加到 ViewModel class,将父控件的 DataContext 设置为 ViewModel 的实例并将父控件和客户端控件绑定到属性.
这就是我真正想要的。
UserControl
和 TextBlock
的 Text
属性 绑定到 UserControl
的 Prop
属性。 (这只是我实际问题的代表)
下面是我的一部分 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" />
有效。但是,当我尝试将 UserControl
的 Prop
属性 绑定到 MyProp
时,它不起作用。
我该怎么做?
像这样使用 RelativeSource
属性:
<userControl:ClientDetailsControl
Prop="{Binding MyProp,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}"/>
它不起作用的原因是绑定路径是相对于 DataContext,而不是(父)控件。
这就是为什么您可以通过设置 RelativeSource 来解决这个问题;在这种情况下,绑定路径使用 RelativeSource 作为查找 属性.
的起点另一种解决方法是命名父级并设置绑定的 ElementName。
MVVM 方法是将 属性 添加到 ViewModel class,将父控件的 DataContext 设置为 ViewModel 的实例并将父控件和客户端控件绑定到属性.