C# 如何在WPF中使用用户控件实现数据绑定?

C# 如何在WPF中使用用户控件实现数据绑定?,c#,wpf,data-binding,xaml,user-controls,C#,Wpf,Data Binding,Xaml,User Controls,我是WPF的新手,在让数据绑定按我所希望的方式工作时遇到了一些问题。我已经编写了一个用户控件,其中包含一个TextBox,我想将它的文本属性绑定到我的UserControl的属性,我想再次绑定到其他属性 我错过了什么 XAML <!-- User Control --> <TextBox Text="{Binding Path=TheText}" /> <!-- Window --> <WpfApplication1:SomeControl TheTe

我是WPF的新手,在让数据绑定按我所希望的方式工作时遇到了一些问题。我已经编写了一个用户控件,其中包含一个TextBox,我想将它的文本属性绑定到我的UserControl的属性,我想再次绑定到其他属性

我错过了什么

XAML

<!-- User Control -->
<TextBox Text="{Binding Path=TheText}" />

<!-- Window -->
<WpfApplication1:SomeControl TheText="{Binding Path=MyStringProp}" />
向奥利弗·哈纳皮致意


PS:我尝试在我的用户控件上实现INotifyPropertyChanged接口,但没有任何帮助。

您想将文本框的
文本
属性绑定回它所在的用户控件的
文本
属性,对吗?因此,您需要告诉绑定属性所在的位置。有几种方法可以做到这一点(您可以使用FindAncestor使用RelativeSource实现),但最简单的方法是在XAML中为UserControl指定一个“名称”,并使用元素绑定进行绑定:

<UserControl ...
    x:Name="me" />
    <TextBox Text="{Binding TheText,ElementName=me}" />
</UserControl>


现在,您的文本框将反映您分配(或绑定)给“SomeControl.TheText”属性的值-您无需更改任何其他代码,尽管您可能希望在底层MyClass对象上实现INotifyPropertyChanged,以便绑定知道属性何时更改。

Matt为您的问题提供了解决方案。这里有更多的解释和提示,可以在将来停止这个问题

SomeControl.DataContext
SomeControl
构造函数中设置时,窗口的绑定
TheText=“{binding Path=MyStringProp}”
具有类型为
SomeControl
Source
,而不是您想要的
MyClass

任何在运行时失败的绑定都会导致将调试消息记录到Visual Studio的输出面板。在本例中,您会发现“SomeControl”类型的对象上不存在此类属性“MyStringProp”,这应该引起您的怀疑


我认为每个人都会发现WPF数据绑定需要一些时间来学习,尤其是调试,但要坚持下去。WPF中的数据绑定真是太棒了,我仍然很高兴知道它是多么容易使UI上的数据保持最新。

我正在将UserControl的DataContext在其构造函数中设置为“this”,因此绑定知道该属性的含义。文本框的值也被正确地绑定到UserControl的属性,但是数据绑定似乎在我的Windows中丢失了。啊,对了,是的,我见过有人这样做。我认为这就是在窗口级别混淆绑定的原因。用元素绑定就不需要了。好吧,我现在解决了。问题是我需要在窗口中将绑定模式设置为双向。谢谢你的帮助!
<UserControl ...
    x:Name="me" />
    <TextBox Text="{Binding TheText,ElementName=me}" />
</UserControl>