今天最后一个问题。
我是 MVVM 建模的新手,并且对它的理解已经取得了相当多的成就,但是在我通过摆弄我的整个项目之前,我需要一些指导。
我创建了一个名为 Person 的模型,它具有以下内容:
- 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 Model 数据。完美运行,我可以通过绑定显示第一级数据,例如人名:{Binding Path=ClickedPerson.Name}
我的问题是:我怎样才能有一个 ItemsControl 来显示那个人的数据的第 2 级和第 3 级?意思是,如果我要实现一个 ItemsControl,其中将有一个带有 1 个新 UserControl(例如)的堆栈面板,用于该人生活中的每个 OldJob,然后让该 UserControl 的子控件反映该旧工作的特定数据,例如文本框中的职业或薪水=> 如何在 XAML 中编写绑定部分?
不用担心 UI,我可以处理,这只是我不确定的 Binding 部分。
如果我像盲人大猩猩一样解释它,请告诉我...
更新:按照你们所说的,我编写了下面的简单 UI 绑定,但它没有显示任何内容。我究竟做错了什么?
<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>
更新2:我没有得到这个是吗??
根据我读过的内容和你们所说的,我已经在我的 ViewModel 和 View 中写了这个......认为它会起作用,但在我的 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);
}
}
在我的 View 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>