Привязка данных Winforms: путь навигации с разделителями периода, так как DataMember вызывает исключение. Зачем? - PullRequest
3 голосов
/ 09 августа 2011

У меня постоянно возникают проблемы с привязкой данных 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: невозможно связатьдля свойства или столбца Name в источнике данных.

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

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

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

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

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Я нашел решение.По-видимому, DataSource должен быть не отдельным объектом, а коллекцией:

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

Раздел «Типы привязки данных» из Страница MSDN «Связывание данных и формы Windows» упоминается, что существует два типа привязок данных: «простые» и «сложные».Последний тип привязки также называется «привязкой на основе списка».Кажется, что навигационные пути поддерживаются только с последним типом привязки.

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

0 голосов
/ 17 мая 2012

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

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