2016-12-24 67 views
0

我想在datagrid單元格中顯示集合的內容。有什麼特別之處在於,列標題必須與特定的集合項目綁定(即每個工作日一個)。單元格內容應該是相應集合中每個員工的文本框。 columnheaderpart工作正常。綁定datagridcell以顯示集合的內容

視圖模型的層次結構如下所示:

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 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,所以Cell DataTemplate的'DataContext'可能是'Project'的一個實例,因爲DataGrid的'ItemsSource'是一個名爲'Projects'的集合。 *通過*臨時確認*用

+0

我的關注點是:DataContext.Planning.Projects.Days [0] .Employees。這條道路上有很多可能是由於對數據上下文如何工作的誤解而產生的,但也可能是視圖模型設計中一些非常規選擇的產物。 'Project'是否有'DataContext'屬性?我建議不要使用它作爲viewmodel屬性名稱。我不確定「Projects.Days」應該怎麼做;不是'項目'通用集合?我希望它是'ObservableCollection '。 –

+0

你是對的:'

回答

0

DataContext的細胞DataTemplate大概是Project一個實例,因爲ItemsSourceDataGrid是一個叫Projects集合。

因此,在CellTemplate,在Binding任何Path應該是指一個Project的特性,正如在Projectname柱:

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

ProjectDataContext對於每一列。以上Binding工程,因爲ProjectnameProject的財產。

所以這應該工作:

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

ProjectDays集合。您需要Days中第一個項目的Employees集合。