首页 > 解决方案 > C# WPF 绑定深度/子对象路径

问题描述

我有一个看起来像这样的 WPF 控件:

<UserControl x:Class="MyApp.MyControl" ...etc...>
  <StackPanel>
    <Label Content="Contact Information" /> 
    <TextBox x:Name="txtContactAddress" Text="{Binding Path=Contact.Address}">
    <Label Content="Organization Information" /> 
    <TextBox x:Name="txtOrgAddress" Text="{Binding Path=Organization.Address}">
  </StackPanel>
</UserControl>

幕后代码如下:

namespace MyApp
{
  public class MyControl : UserControl
  {
    public DataBindings Data = new DataBindings();

    public MyControl()
    {
      InitializeComponent();
      this.DataContext = Data;
    }
  }

  public class DataBindings
  {
    public ContactData Contact;
    public OrganizationData Organization;
    public OtherData Other;

    public DataBindings()
    {
      Organization = new OrganizationData();
      Organization.Address = "123 Test Street";

      Contact = new ContactData();
      Contact.Address = "456 Test Street";
    }
  }
}

基于我一直在阅读的各种教程和文章,我的期望是绑定会在用户控件上找到 DataContext 属性,然后从那里,它会查看路径并跟随子对象,以便值在 MyControl.DataContext.Contact.Address 中找到的将显示在 MyControl.txtContactAddress 中。

显然,这不会发生,如果我只是将 Path 变成一个属性,我 - 可以 - 让它工作:

<TextBox x:Name="txtContactAddress" Text="{Binding Path=Address}">

...然后只需将 DataContext 直接设置为 DataBindings.Contact 子对象:

    public MyControl()
    {
      InitializeComponent();
      this.DataContext = Data.Contact;
    }

然而,这打破了对本组织的约束。我只是错过了 Path 元素的一些基本语法吗?

编辑:这不是重复的: 为什么 WPF 支持绑定到对象的属性,但不支持绑定到字段?

该答案可能会解决这个问题,但它假设用户已经知道 field-vs-property 是根本原因。换句话说,当我开始时,我不会知道问题在于我使用了字段,所以我不会找到其他答案。然而,这个问题正在努力确定根本原因并导致其他答案。我建议不要将此标记为重复。

标签: c#wpf

解决方案


没关系,您只是想念 get 和 set 属性访问器:

 public class DataBindings
    {
        public ContactData Contact { get; set; }
        public OrganizationData Organization { get; set; }
        public OtherData Other { get; set; }

        public DataBindings()
        {
            Organization = new OrganizationData();
            Organization.Address = "123 Test Street";

            Contact = new ContactData();
            Contact.Address = "456 Test Street";
        }
    }

推荐阅读