2016-12-24 7 views
0

データグリッドセルにコレクションのコンテンツを表示するとします。特別なのは、列ヘッダーが特定のコレクションアイテム(つまり、各勤務日に1つ)にバインドされていることです。セルの内容は、コレクションに従って各従業員のテキストボックスにする必要があります。 columnheaderpartは正常に動作しています。データグリッドセルをバインドしてコレクションのコンテンツを表示する

のviewmodelの階層は次のとおりです。ただし、次のコードは動作していない

Planning holds a collection of Projects and a collection of Days(used to get the columnheader) 
Project holds a collection of Days 
Day holds a collection of Employees 

。デバッグから、私はそれが従業員コレクションへのアクセスがないので、バインディングの問題であると信じるようになります。なぜこれがうまくいかないのか? DataGridためItemsSourceProjectsと呼ばれるコレクションですので

<DataGrid Grid.Row="0" Grid.Column="1" AutoGenerateColumns="False" ItemsSource="{Binding Planning.Projects}" ColumnHeaderHeight="50"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Width="200" Header="Project" Binding="{Binding Projectname}"> 
     </DataGridTextColumn> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.HeaderTemplate> 
       <DataTemplate> 
        <TextBlock DataContext="{Binding DataContext.Week.Days[0].Id, RelativeSource={RelativeSource AncestorType=DataGrid}}" HorizontalAlignment="Center"> 
        <Run Text="{Binding Mode=OneWay, StringFormat=ddd}"/> 
        <LineBreak/>    
        <Run Text="{Binding Mode=OneWay, StringFormat=dd.MM.yyyy}"/> 
        </TextBlock> 
       </DataTemplate> 
      </DataGridTemplateColumn.HeaderTemplate> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ItemsControl ItemsSource="{Binding DataContext.Planning.Projects.Days[0].Employees}"> 
         <ItemsControl.ItemsPanel> 
          <ItemsPanelTemplate> 
           <StackPanel Orientation="Horizontal"/> 
          </ItemsPanelTemplate> 
         </ItemsControl.ItemsPanel> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding Name}"/> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl>         
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
+1

OK、 'DataGrid'の' ItemsSource'が 'Projects'という名前のコレクションであるため、' DataTemplate'セルの 'DataContext'はおそらく' Project'の一つのインスタンスです。テンプレートコンテンツを '

+0

私の懸念はこれです: 'DataContext.Planning.Projects.Days [0] .Employees'。その道には、データコンテキストがどのように機能するかについての誤解の結果である可能性がありますが、ビューモデル設計におけるいくつかの慣習的でない選択の産物でもあります。 'Project'は' DataContext'プロパティを持っていますか?私はそれをviewmodelプロパティ名として使用することをお勧めします。私は 'Projects.Days'のどちらを作るべきかわからない。 'Projects'は一般的なコレクションではありませんか?私はそれが 'ObservableCollection 'であることを願っています。 –

+0

あなたは正しいです: '

答えて

0

セルDataTemplateためDataContextは、おそらくProjectの1つのインスタンスです。

したがって、CellTemplateに、Binding上の任意PathだけProjectname列のように、Projectのプロパティを参照されるべきである:

<DataGridTextColumn 
    Width="200" 
    Header="Project" 
    Binding="{Binding Projectname}"> 

Projectは、各列のDataContextあります。 ProjectnameProjectのプロパティであるため、上記のBindingが機能します。

だから、これは動作するはずです:

<ItemsConttrol 
    ItemsSource="{Binding Days[0].Employees}" 
    ... 

ProjectDaysコレクションを持っています。このプロジェクトのの最初の項目のEmployeesコレクションが必要です。

関連する問題