Последний вопрос дня.Сопоставление данных на нескольких уровнях
Я новичок в моделировании MVVM и достиг совершеннолетия с моим пониманием этого, но мне понадобилось бы руководство по чему-то, прежде чем я вверну свой весь проект, возившись вокруг.
Я создал модель с именем человека, который ниже:
- General info like: ID, FirstName, LastName, FullName, Nationality etc.
- A list of old jobs
- Each job (a separate model) within the old jobs list has data as well such as YearStarted, YearEnded, Occupation, Company etc.
Так что моя модель выглядит следующим образом:
- Person:
- ID
- Name
- Nationality
- Jobs:
- Job1:
- Occupation
- Started
- Ended
- Salary
- Duties:
- Duties 1
- Duties 2
- Job2:
- Occupation
- Started
- Ended
- Salary
- Duties:
- Duties 1
- Duties 2
- Duties 3
На мой взгляд, список людей, показывает отлично. Когда я нажимаю на одного из людей, я открываю новую страницу WPF с собственным контролем. Я создал конструктор с именем ClickedPerson, который извлекает данные модели Person человека, которого щелкнули. Работает отлично, и я могу показать данные первого уровня, такие как имя человека путем привязки как такового: {Binding Path = ClickedPerson.Name}
Мой вопрос: как я могу иметь элемент ItemsControl, который будет показывать уровень 2 и уровень 3 данных этого человека? Смысл, если бы я должен был внедрить элемент ItemsControl, где бы была стекная панель с 1 новым UserControl (например) для каждого OldJob в жизни человека, а затем, чтобы дочерние элементы UserControl отображали конкретные данные старой работы, такие как Занятие или Зарплата в текстовых окнах => Как написать обязательную часть в XAML?
Не беспокойтесь о пользовательском интерфейсе, я могу справиться с этим, это просто связанная часть, о которой я не знаю.
Позвольте мне знать, если я объяснил, как слепая горилла ...
UPDATE: Так с тем, что вы, ребята, говорят, я написал связывание ниже простой пользовательский интерфейс, но он не показывает ничего. Что я делаю не так?
<TreeView Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="3"
ItemsSource="{Binding Path=ClickedPerson}">
<!-- List of OldJobs teamplate -->
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Duties}">
<TextBlock Foreground="White" Text="{Binding JobNumber}" />
<!-- Job template -->
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Occupation}" />
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
UPDATE 2: Я не получаю это я ??
Я написал это в моем ViewModel и видом на основе того, что я прочитал, и что вы, ребята сказали ... Думал, что это будет работать, но ничего не показывает в моем Treeview:
private Person _clickedPerson;
public CollectionViewSource ClickedPersonJobs { get; set; }
public Person ClickedPerson
{
get { return _clickedPerson; }
set
{
_ clickedPerson = value;
ClickedPersonJobs = new CollectionViewSource();
ClickedPersonJobs.SortDescriptions.Add(new SortDescription("JobNumber", ListSortDirection.Ascending));
ClickedPersonJobs.GroupDescriptions.Add(new PropertyGroupDescription("JobNumber"));
ClickedPersonJobs.Source = _ clickedPerson.OldJobs;
NotifyOfPropertyChange(() => ClickedPerson);
}
}
и на мой взгляд, XAML-файл:
<TreeView ItemsSource="{Binding ClickedPersonJobs }"
Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="3">
<!-- Job teamplate -->
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Duties}">
<TextBlock Foreground="Red" Text="{Binding Occupation}" />
<!-- Duties template -->
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Description}" />
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Я думаю, что это должно работать при условии 'ClickedPerson' коллекция вашей модели' Person' – AsitK
Я думаю, вам нужно указать тип данных для шаблона – AsitK
Я надеюсь, что Вы установили DataContext вида ViewModel ..;) – AsitK