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

我是WPF的新手,我在使用数据绑定工作时遇到了一些问题。 我编写了一个用户控件,其中包含一个TextBox,我的Text-Property要绑定到UserControl的属性,我想再绑定到其他东西。

我错过了什么?

XAML

    

C#

 // User Control ---- public partial class SomeControl : UserControl { public DependencyProperty TheTextProperty = DependencyProperty .Register("TheText", typeof (string), typeof (SomeControl)); public string TheText { get { return (string)GetValue(TheTextProperty); } set { SetValue(TheTextProperty, value); } } public SomeControl() { InitializeComponent(); DataContext = this; } } // Window ---- public partial class Window1 : Window { private readonly MyClass _myClass; public Window1() { InitializeComponent(); _myClass = new MyClass(); _myClass.MyStringProp = "Hallo Welt"; DataContext = _myClass; } } public class MyClass// : DependencyObject { // public static DependencyProperty MyStringPropProperty = DependencyProperty // .Register("MyStringProp", typeof (string), typeof (MyClass)); public string MyStringProp { get; set; } // { // get { return (string)GetValue(MyStringPropProperty); } // set { SetValue(MyStringPropProperty, value); } // } } 

最好的祝福
奥利弗哈纳皮

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

您希望将TextBox的Text属性绑定回TheText在的UserControl的TheText属性,对吧? 所以你需要告诉绑定财产所在的位置。 有两种方法可以做到这一点(您可以使用FindAncestor使用RelativeSource),但最简单的方法是在XAML中为UserControl指定一个“名称”并使用元素绑定进行绑定:

    

现在,您的TextBox将反映您为“SomeControl.TheText”属性分配(或绑定)的值 – 您不需要更改任何其他代码,尽管您可能希望在底层MyClass对象上实现INotifyPropertyChanged,绑定知道属性何时发生了变化。

马特为您的问题提供了解决方案。 这是一个更多的解释和暗示将来阻止这个问题。

由于SomeControl.DataContext是在SomeControl构造函数中设置的,因此窗口的绑定TheText="{Binding Path=MyStringProp}"具有SomeControl类型的Source ,而不是您想要的MyClass

在运行时失败的任何绑定都会将调试消息记录到Visual Studio的输出面板中。 在这种情况下,你会发现在’SomeControl’类型的对象上不存在这样的属性’MyStringProp’,这应该引起你的怀疑。

我想每个人都发现WPF数据绑定需要一些时间来学习,特别是调试,但坚持不懈。 WPF中的数据绑定非常棒,我仍然知道如何轻松地使我的UI上的数据保持最新。