Данные-обязательны обязанности и достижения: период с запятой путь навигации как 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 ответа:
Я нашел решение. Очевидно, что
DataSource
должен быть не единичным объектом, а совокупностью:authorLabel.DataBindings.Add("Text", new Book[] { bookToBeDisplayed }, // <-- "Author.Name");
В разделе "типы привязки данных" страницы MSDN "привязка данных и Windows Forms"упоминается, что существует два типа Привязок данных: "простые" и "сложные". Последний тип привязки также называется "привязкой на основе списка". Похоже, что навигационные пути поддерживаются только с последним типом привязки.
P.S.: MSDN также рекомендует использовать
BindingList<T>
, хотя, возможно, в этом нет необходимости.