本日最後の質問。
私は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
私の見解では、People のリストは完全に表示されます。人の 1 人をクリックすると、独自のコントロールを持つ新しい WPF ページが開きます。クリックされた人物の人物モデル データを取得する ClickedPerson というコンストラクタを設定しました。完全に機能し、次のようにバインディングによって人の名前などの第 1 レベルのデータを表示できます: {Binding Path=ClickedPerson.Name}
私の質問は、その人のデータのレベル 2 とレベル 3 を表示する ItemsControl をどのように作成できますか? つまり、個人の生活の中で OldJob ごとに (たとえば) 1 つの新しい UserControl を持つスタックパネルが存在する ItemsControl を実装し、その UserControl の子コントロールに、テキストボックスの職業や給与などの古い仕事の特定のデータを反映させるとします。 => XAML でバインド部分を記述するにはどうすればよいですか?
UI については心配しないでください。対処できます。不明な点はバインディング部分だけです。
盲目のゴリラのように説明したら教えてください...
更新:あなたが言っていることで、私は以下の単純な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>