Привязка к TreeView и DataGrid

#wpf #data-binding

#wpf #привязка к данным

Вопрос:

Я довольно новичок в WPF, и у меня возникла проблема, которую я не могу решить. Существует набор данных с двумя таблицами, T1 и T2. T1 имеет рекурсивную структуру, подобную этой

Родительское
имя t1ID

и это отношение:

 ds.Relations.Add("RecursiveRel",
  tables["T1"].Columns["T1Id"],
  tables["T1"].Columns["ParentId"]);
 

Я отображаю эту таблицу в виде дерева, привязывая ее к DataView:

 DvT1 = ds.Tables[0].DefaultView;
DvT1.RowFilter = string.Format("Id = '{0}'", IdOfFirstRecord);
 

И в XAML:

 <TreeView ItemsSource="{Binding DvT1}">
  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding RecursiveRel}">
      <TextBlock Text="{Binding Name}" />
    </HierarchicalDataTemplate>
  </TreeView.ItemTemplate>
</TreeView>
 

Это работает нормально и хорошо отображает иерархию в виде дерева.

И теперь в игру вступает таблица T2, которая имеет такую структуру:

T2Id Имя t1ID

Между T1 и T2 существует соотношение 1: n, где n> = 0. В набор данных была добавлена связь:

 ds.Relations.Add("T1ToT2",
  tables["T1"].Columns["T1Id"],
  tables["T2"].Columns["T1Id"]);
 

T2 использует сетку данных, и она должна отображать только записи, которые связаны с текущей выбранной записью T1.
Что должно быть введено в ItemsSource DataGrid, чтобы это произошло? Я не нашел ничего, что могло бы это сделать.
Я также должен заметить, если это имеет значение, что это приложение MVVM, поэтому использование кода не является вариантом.

Любая помощь приветствуется.

Комментарии:

1. Если это приложение MVVM, почему вы используете эти странные таблицы и отношения? Рекомендуется преобразовать все модели для просмотра моделей и использовать реальные свойства и наблюдаемые коллекции вместо наборов данных и других динамических представлений.

2. Вот как я получаю данные из удаленной системы (не Microsoft). Почему эти таблицы странные? Из-за рекурсивной структуры T1?

3. Из-за строковых литералов и квадратных скобок. Сначала было бы лучше создать модели представлений для каждой модели данных, потому что привязка к классу like class T1ViewModel { public ObservableCollection<T2ViewModel> T2Items { get; set; } } намного удобнее и проще.

4. «это приложение MVVM, поэтому использование кода не является вариантом»: вы должны выбросить это из головы… MVVM не означает «отсутствие кода». Иногда code-behind это подходящее место, чтобы что-то сделать (хотя, вероятно, не в этом случае)

5. Хотел бы я дать вам дополнительный балл за то, как вы спросили: «Что нужно добавить в ItemsSource DataGrid, чтобы это произошло?» Это единственный вопрос / ответ, который действительно помог мне с моими конкретными проблемами привязки TreeView / Entity Framework. Очень, очень благодарен!

Ответ №1:

Вы пробовали это?

 <DataGrid ItemsSource="{Binding SelectedItem.T1ToT2, ElementName=theTreeView}" />
 

Комментарии:

1. Ах, это сделало свое дело! Merci! Да, я знаю, я не должен быть слишком догматичным в отношении code-behind и MVVM. Я также попробую предложение vorrtex и преобразоваю набор данных в ObservableCollection / Properties.