如何实现与WPF用户控件数据绑定?(How to achieve databinding with

2019-09-21 03:55发布

我是相当新的WPF,我有一些问题让数据绑定工作,我想。 我写它包含一个TextBox我想结合我的用户,我想再次绑定到别的东西的属性,其文本属性的用户控件。

我在想什么?

XAML

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

<!-- Window -->
<WpfApplication1:SomeControl TheText="{Binding Path=MyStringProp}" />

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); }
//  }
}

最好的祝福
奥利弗Hanappi

PS:我一直在努力,实现我的用户控制INotifyPropertyChanged接口,但它并没有帮助。

Answer 1:

你要绑定Text的文本框的财产退还TheText它生活在用户控件的属性,对不对? 所以,你需要告诉的结合,其中的财产生活。 有一对夫妇的方式做到这一点(你可以使用一个FindAncestor做的RelativeSource它),但最简单的方法就是给用户控件“名称”中的XAML和使用元素绑定绑定:

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

现在你的文本框将反映您分配(或绑定)到你的“SomeControl.TheText”属性的值 - 你不需要更改任何其他代码,虽然你可能会想实现你的潜在MyClass的INotifyPropertyChanged的对象,以便出装订知道什么时候该属性已经改变。



Answer 2:

马特已经提供了解决您的问题。 这里有更多的解释,并暗示今后停止这个问题。

作为SomeControl.DataContext在设置SomeControl构造函数,窗口的约束力TheText="{Binding Path=MyStringProp}"SourceSomeControl ,不是MyClass你意。

这在运行时失败原因的调试消息的任何绑定记录到的Visual Studio输出面板。 在这种情况下,你会看到,没有这样的财产“MyStringProp”上键入“SomeControl”,这应该提出你的怀疑的对象存在。

我想,每个人都认为WPF数据绑定需要一些时间来学习,特别是调试,但坚持下去。 数据在WPF结合真的是太棒了,我仍然得到一个踢出来知道它使多么容易在我的用户界面中的数据保持最新的。



文章来源: How to achieve databinding with a user control in WPF?