0

本日最後の質問。

私は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>
4

4 に答える 4

0

これは MVVM の問題ではなく、Bindingパスの構文の問題です。そのため、MSDN のBinding.Path プロパティページを表示することをお勧めします。

リンクされたページから:

ソースがコレクション ビューの場合、現在のアイテムをスラッシュ (/) で指定できます。たとえば、句 Path=/ は、ビュー内の現在のアイテムへのバインディングを設定します。ソースがコレクションの場合、この構文はデフォルト コレクション ビューの現在のアイテムを指定します。

基本的に、これは、次を使用して、選択された から選択されBindingた を表示できることを意味します。OccupationJobPerson

{Binding PersonCollection/JobCollection/Occupation}
于 2013-09-06T11:31:41.653 に答える
0

WPF の TreeView を使用できます。HierarchialDataTemplateここであなたを助けます。

簡単な例については、MSDN を参照してください。ここにリンクの説明を入力してください

 <HierarchicalDataTemplate DataType    = "{x:Type src:League}"
                            ItemsSource = "{Binding Path=Divisions}">
    <TextBlock Text="{Binding Path=Name}"/>
  </HierarchicalDataTemplate>

  <HierarchicalDataTemplate DataType    = "{x:Type src:Division}"
                            ItemsSource = "{Binding Path=Teams}">
    <TextBlock Text="{Binding Path=Name}"/>
  </HierarchicalDataTemplate>

  <DataTemplate DataType="{x:Type src:Team}">
    <TextBlock Text="{Binding Path=Name}"/>
  </DataTemplate>

これは、3 レベルの階層を示しています。

League
    Division
       Team

重要なのは、HierarchicalDataTemplate の ItemsSource を使用し、それぞれに正しい DataTemplate を提供することです。

于 2013-09-06T11:30:37.760 に答える
0

私はあなたのようなものを持っている例を持っていますが、(あなたの Jobs と Job1、Job2 の代わりに) Buttongroups と Buttons を使用しています ObservableCollection<ButtonGroups> Groups. LabelString と ButtonCommand を宣言するボタンを含む ObservableCollection。

私のItemsControlは次のようになります:

<ItemsControl x:Name="Groups" ItemsSource="{Binding Groups}">
<ItemsControl.ItemTemplate>
 <DataTemplate>         
   <GroupBox Header="{Binding Path=GroupName}">
      <ItemsControl ItemsSource="{Binding Buttons}">
         <ItemsControl.ItemTemplate>
           <DataTemplate>
             <Button Content="{Binding Path=LabelString}" Command="{Binding Path=ButtonCommand}"/>
           </DataTemplate>
         <ItemsControl.ItemsPanel>
           <ItemsPanelTemplate>
             <StackPanel x:Name="BtnStackPanel" Orientation="Horizontal"/>
           </ItemsPanelTemplate>  
         <ItemsControl.ItemsPanel>
      </ItemsControl>
    </GroupBox>
 </DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
 <ItemsPanelTemplate>
   <StackPanel x:Name="GroupStackPanel" Orientation="Horizontal"/>
 </ItemsPanelTemplate>
<ItemsControl.ItemsPanel>

定義したボタンの行が表示されます。したがって、ボタンごとに 1 つの ItemsControl があります。ItemsControl を変更して、表示するジョブと各ジョブのプロパティを含めることができます。

これが私の質問です。どこで入手したか:リンク

お役に立てば幸いです。

于 2013-09-06T11:40:52.363 に答える
0

DataGridのリストをPersonとして受け取る here を持つことができますItemsSource。これを行うと、各 DataGridRow には のオブジェクトが含まPersonれますDataContextDataGridのプロパティにバインドされた列を含めることができるようになりましPersonた。

次にRowDetailsTemplate、階層データを表示する を定義できます。行テンプレートをDataGrid再度設定して、その中のジョブを表示できます。このDataContextデータグリッドは Person オブジェクトでもあり、個人内の JobList にバインドしてデータを入力できます。同様に、複数の階層を持つことができます。

     <DataGrid ItemsSource="{Binding PersonList}">
            <DataGrid.Columns>
                <DataGridTextColumn IsReadOnly="True" Binding="{Binding FirstName}"/>
                <DataGridTextColumn IsReadOnly="True" Binding="{Binding LastName}"/>
                <DataGridTextColumn IsReadOnly="True" Binding="{Binding FullName}"/>
            </DataGrid.Columns>
            <DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <DataGrid ItemsSource="{Binding Jobs}">
                        <DataGrid.Columns>
                            <DataGridTextColumn IsReadOnly="True" Binding="{Binding Occupation}"/>
                            <DataGridTextColumn IsReadOnly="True" Binding="{Binding Started}"/>
                            <DataGridTextColumn IsReadOnly="True" Binding="{Binding Salary}"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>

ありがとう

于 2013-09-06T11:41:42.210 に答える