今天最后一个问题。
我是 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>