Есть класс Book
class Book
{
public int Id { get; set; }
public string Title { get; set; }
public string Authors { get; set; }
public string Genre { get; set; }
public virtual ICollection Publications { get; set; }
}
На форме есть два (пусть будут A и B) DataGrid'a: A отображает список объектов Book, B отображает элементы Publications выбранной книги (то есть, привязка к выбранной строке в A).
Вопрос в том, как правильно привязаться в B к текущей строке в A?
Я делаю так, но на мой взгляд это не совсем кошерно:
// Второй DataGrid
...
WorkingBooksSet это ObservableCollection во ViewModel'e
@VladD, я, кажется, не понимаю чего-то фундаментального.
Если пользоваться Вашим способ привязки ItemsSource={Binding WorkingBooksSet/Publications}, то я не получу именно выделенную строку в первом DataGrid. Надеюсь, Вы меня поняли.
Мой способ мне не нравится тем, что если я изменю имя свойства в модели, то оно не изменится во View, так как у меня привязка:
ItemSource={Binding ElementName=BooksGrid,Path=SelectedItem.Publications}
а SelectedItem имеет тип object, то есть привязанное поле (ISBN, например, в моем случае) найдется только во время выполнения.
Разобрался. @VladD, спасибо за помощь и за табличку!
Ответ
А что именно вам не нравится в вашем коде?
Я бы правда забиндился как-нибудь так:
ItemsSource={Binding WorkingBooksSet/Publications}
(но это наверное вкусовщина).
Вот вам шпаргалка по binding'ам: http://www.nbdtech.com/Free/WpfBinding.pdf
Проблема, о которой вы говорите — фундаментальная для WPF. В XAML указывается лишь имя свойства, которое не связано с настоящим типом, и проверяется только на этапе выполнения, а не компиляции. Так было сделано, насколько я понимаю, чтобы избежать зависимости View от нижележащих уровней (VM и модели). Так что исправить её, по идее, невозможно, надо внимательно следить за переименованиями и ошибками binding'а на консоли.
Такие дела.
Комментариев нет:
Отправить комментарий