WPF DataGrid - динамическая двусторонняя привязка к экземплярам T в ObservableCollection <T> - PullRequest
0 голосов
/ 03 мая 2019

Предположим, у меня есть модель (для краткости опущена полная реализация INotifyPropertyChanged):

public class MyModel : INotifyPropertyChanged
{
    public int Id { get; set; }
    public string Name { get; set; }
    // ... 
}

с моделью представления (также опущены полные реализации INotify ...):

public class MyViewModel : INotifyPropertyChanged 
{ 
    public int SomethingUnrelatedToProblem { get; set; }
    // ... 
    public ObservableCollection<MyModel> MyModels { get; set; } 
}

a MyView.xaml, содержащий DataGrid (это отрывок):

<DataGrid Name="MyModelDataGrid" ItemsSource="{Binding MyModels}"/>

и, наконец, код:

public class MyWindow : Window 
{
    public MyWindow()
    {
        InitializeComponent();
        DataContext = MyViewModel();
    }
}

В нынешнем виде этот код будет правильно создавать DataGrid, который успешно выполняет следующие действия:

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

Однако любые изменения, внесенные в саму DataGrid, не распространяются назад в соответствующиеэкземпляры MyModel.

Я думаю (поправьте меня, если я ошибаюсь - я новичок в WPF / MVVM), что этого можно достичь, расширив объявление DataGrid в MyView.xaml, чтобы включить внутренние теги сстолбцы, указав Header="<MyModel.PropertyNameA" Text="{Binding PropertNameA}".

Но!Мне бы хотелось, чтобы это «связывание ячеек» происходило динамически (точно так же, как столбцы генерируются автоматически).Причина этого в том, что он более расширяем относительно изменений в MyModel, то есть мне не нужно менять и MyModel, и MyView.xaml для дополнительных свойств.

Возможно ли это?Если так, как это можно сделать?

...