#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.