Данные-обязательны обязанности и достижения: период с запятой путь навигации как DataMember вызывает исключение. Почему?


У меня постоянно возникают проблемы с привязкой данных 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.Text и bookToBeDisplayed.Author.Name, вызывает следующее исключение:

ArgumentException: не удается выполнить привязку к свойству или имени столбца в источнике данных.

Раздел "Примечания" страницы MSDN о компании System.Windows.Forms.Binding объясняет, что разделенные периодами навигационные пути могут использоваться как DataMember:

можно также использовать разделенный точкой путь навигации при привязке к объекту, свойства которого возвращают ссылки на другие объекты (например, класс со свойствами, возвращающими другие объекты класса).

Что я должен сделать, чтобы вышеприведенный пример сработал?

  • я уже убедился, что экземпляр Book, переданный конструктору SomeForm, правильно инициализирован, и что там нет ссылок null.
  • Я также не хочу прибегать к DataSets.
2 3

2 ответа:

Я нашел решение. Очевидно, что DataSource должен быть не единичным объектом, а совокупностью:

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

В разделе "типы привязки данных" страницы MSDN "привязка данных и Windows Forms"упоминается, что существует два типа Привязок данных: "простые" и "сложные". Последний тип привязки также называется "привязкой на основе списка". Похоже, что навигационные пути поддерживаются только с последним типом привязки.

P.S.: MSDN также рекомендует использовать BindingList<T>, хотя, возможно, в этом нет необходимости.

Вы можете попробовать это

authorLabel.DataBindings.Add("Text",bookToBeDisplayed.Author,"Name");