3

我一直遇到 Winforms 数据绑定问题,更具体地说,每当我指定一个以句点分隔的属性路径用作DataMember. 例如:

public partial class SomeForm : System.Windows.Forms.Form
{
    public SomeForm(Book bookToBeDisplayed)
    {
        InitializeComponent();

        authorLabel.DataBindings.Add("Text", bookToBeDisplayed, "Author.Name");  
                                          // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                          //    I cannot get this to work.
    }
}


public class Book : INotifyPropertyChanged
{
    public Person Author { … }
    …
}

public class Person : INotifyPropertyChanged
{
    public string Name { … }
    …
}

我在其中添加绑定的行authorLabel.TextbookToBeDisplayed.Author.Name 引发以下异常:

ArgumentException:无法绑定到 DataSource 上的属性或列名称。

MSDN 页面System.Windows.Forms.Binding的“备注”部分解释了以句点分隔的导航路径可用作DataMember

当您绑定到其属性返回对其他对象的引用的对象(例如具有返回其他类对象的属性的类)时,您还可以使用以句点分隔的导航路径。

我必须做什么才能使上述示例正常工作?

  • 我已经确保Book传递给 的构造函数的实例SomeForm已正确初始化,并且没有null引用。
  • 我也不想诉诸于DataSets
4

2 回答 2

1

我找到了解决方案。显然,DataSource不能是单个对象,而是一个集合:

authorLabel.DataBindings.Add("Text",
                             new Book[] { bookToBeDisplayed },  // <--
                             "Author.Name");

MSDN 页面“数据绑定和 Windows 窗体”的“数据绑定类型”部分提到有两种类型的数据绑定:“简单”和“复杂”。后一种绑定类型也称为“基于列表的绑定”。似乎只有后一种绑定类型支持导航路径。

PS: MSDN 也推荐使用BindingList<T>,虽然这里可能没有必要。

于 2011-08-08T20:40:32.647 回答
-1

你可以试试这个

authorLabel.DataBindings.Add("Text",bookToBeDisplayed.Author,"Name");
于 2012-05-17T10:00:49.240 回答