Wpf 通过DependencyProperty字符串绑定到属性名称

Wpf 通过DependencyProperty字符串绑定到属性名称,wpf,xaml,binding,user-controls,dependency-properties,Wpf,Xaml,Binding,User Controls,Dependency Properties,我创建了一个带有ItemContextdependencProperty的UserControl。此属性包含控件的文本属性应绑定到的myDataContext对象的属性名称 我不知道如何在XAML中实现这一点。我试了好几步,离得很近,但都找不到 大概是这样的: <TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type me:UserControl}}, Path=Ite

我创建了一个带有
ItemContext
dependencProperty的
UserControl
。此属性包含控件的文本属性应绑定到的my
DataContext
对象的属性名称

我不知道如何在XAML中实现这一点。我试了好几步,离得很近,但都找不到

大概是这样的:

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type me:UserControl}}, Path=ItemContext}" />
this.txtValue0.SetBinding(TextBox.TextProperty, new Binding(this.ItemContext) { Mode = BindingMode.TwoWay });
<u:MyControl DataContext="{Binding SomeObject}" ItemContext="MyPropertyName" />
<u:MyControl DataContext="{Binding SomeObject}" ItemValue="{Binding MyPropertyName}" />
有人有主意吗


如果我理解正确,谢谢。您想在用户控件xaml中使用usercontrol代码背后的依赖项属性吗? 只要在xaml中为你的用户控件指定一个名称
x:name=“myUserControl”
并在绑定中写入
{Binding ElementName=myUserControl,Path=mydependencProperty}。
至少我是这样做的,除非有人对这个奇怪的限制有更好的理解。

试试这个

Xaml


我为用户控件命名,而不是与相对源绑定。我不知道相对源如何在自绑定中不按预期工作…

听起来好像您正试图将外部值传递到
绑定的
属性中。也就是说,如果
ItemContext
的值为“Blob”,则需要绑定到
DataContext.Blob
(不显示值“Blob”)

这在代码中很容易做到,因为您可以直接引用该值(您可以将
this.ItemContext
作为一次性值传递给绑定)。但是,在标记中,您不能这样做。相反,您试图将值绑定到
绑定的
路径
,但您不能(因为它不是DependencyProperty)

我建议更简单的解决方案是在UserControl上创建一个不同的属性:与其传入“要绑定到的对象的名称”,为什么不传入该对象的值呢

我想象您当前的代码如下所示:

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type me:UserControl}}, Path=ItemContext}" />
this.txtValue0.SetBinding(TextBox.TextProperty, new Binding(this.ItemContext) { Mode = BindingMode.TwoWay });
<u:MyControl DataContext="{Binding SomeObject}" ItemContext="MyPropertyName" />
<u:MyControl DataContext="{Binding SomeObject}" ItemValue="{Binding MyPropertyName}" />

。。。你应该让它看起来像这样:

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type me:UserControl}}, Path=ItemContext}" />
this.txtValue0.SetBinding(TextBox.TextProperty, new Binding(this.ItemContext) { Mode = BindingMode.TwoWay });
<u:MyControl DataContext="{Binding SomeObject}" ItemContext="MyPropertyName" />
<u:MyControl DataContext="{Binding SomeObject}" ItemValue="{Binding MyPropertyName}" />

。。。因此,该值在控件外部解析。在控件中,可以使用@dowhilefor的解决方案绑定到该值


希望这有意义

不确定这是否与此有关,但您没有在XAML代码中设置模式。@Kshitij:它在XAML中是隐式的。我也不确定它是否真的与代码相关。我认为默认模式是单向的。我猜你每天都会学到新东西:)我不相信这能解决OP的问题。我认为
ItemContext
包含他要绑定到的属性的名称,而不是值。@Dan你说得对。我不想直接绑定到属性,而是想绑定属性的值。我认为
ItemContext
包含他想要绑定到的属性的名称,而不是值。我们会看到OP的回复:]嗨,丹,谢谢你的回答。您的语句“这在代码中很容易做到,因为您可以直接引用值”,这是非常正确的。我试图找到一种在XAML中实现这一点的方法,但现在我将在代码中使用它。无法传递值,因为在我的UserControl中有4个控件,每个控件都有不同的DataContext。我建议您按照我的建议更改解决方案。如果你能避免的话,在代码中这样做是非常可怕的!您绑定属性名而不是值有什么原因吗?原因是我有4个不同的DataContext(同一对象的4个实例)在这4个实例中,我的4个控件应该绑定到同一个属性-我希望您能够理解我的解释,如果您只是更改了DataContext,并且使用了常规绑定而不是当前的绑定,那么它仍然可以工作:)我看到了另一种可能性:我可以为我将传递到的4个DataContext中的每一个创建DependencyProperty然后我可以使用常规绑定。