У меня есть коллекция объектов, хранящихся в CollectionViewSource
и привязанных к DataGrid
. Я хочу отобразить «подробный вид» объекта, выбранного в настоящее время в DataGrid
. Я могу получить текущий объект, используя CollectionViewSource.View.CurrentItem
.WPF: динамическое связывание списка с (некоторыми из) свойств объекта
MyClass
{
[IsImportant]
AProperty{}
AnotherProperty{}
[IsImportant]
YetAnotherProperty{}
}
То, что я хотел бы сделать, это дисплея этикетка (с именем свойства) и управление (для редактирования) в ListBox, для каждого из этих свойств отмечен IsImportant
атрибута. Связывание должно работать между внесенными изменениями, DataGrid и объектом поддержки. Отображаемый элемент управления должен меняться в зависимости от типа объекта, который может быть либо boolean
, string
, либо IEnumerable<string>
(я написал IValueConverter
для преобразования между перечислимой и строкой, разделенной символом новой строки).
Кто-нибудь знает о способе выполнения этого? Я могу себе отобразить значения каждого свойства через следующее, но редактирование их не обновят объект подкладочного:
listBox.ItemsSource = from p in typeof(MyClass).GetProperties()
where p.IsDefined(typeof(IsImportant), false)
select p.GetValue(_collectionViewSource.View.CurrentItem, null);
Чтобы уточнить, я хотел бы, чтобы это произошло «автомагический», без ручного указания имен свойств в XAML. Если я могу динамически добавлять XAML во время выполнения, на основе которого свойства помечены атрибутами, это также было бы хорошо.
Это выглядит фантастическим; Я буду реализовывать его, как только у меня появится шанс, и дайте знать, как это происходит. Благодаря! –
Это работает в основном отлично. Я просто добавил нулевую проверку в PropertyValueConverter, так как он получал нулевой объект, когда привязка была впервые установлена. Единственная проблема заключается в том, что в настоящее время, если я изменяю значение этого элемента управления, оно не распространяется на datagrid. Предположительно, объект подложки изменяется, поскольку измененное значение все еще отображается элементом управления items, но сетка не уведомляется. Это связано с Binding.DoNothing? –
@ Daniel: вашему объекту необходимо будет реализовать INotifyPropertyChanged, если вы хотите, чтобы обновления, сделанные одним элементом управления, отражались в других элементах управления, привязанных к одному и тому же свойству. Вам также потребуется реализовать INotifyPropertyChanged в PropertyValue. Свойство PropertyValueConverter для самой привязки ItemsSource, которая является однонаправленной, поэтому ConvertBack не будет вызываться, а Binding.DoNothing не имеет значения. – Quartermeister