绑定datagridcell以显示集合的内容

时间:2016-12-24 16:19:46

标签: c# wpf xaml data-binding

我想在datagrid单元格中显示集合的内容。特别之处在于,列标题绑定到特定的集合项(即每个工作日一个)。单元格内容应该是相应集合中每个员工的文本框。 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

但是,以下代码无效。从调试开始,我认为这是绑定问题,因为无法访问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 个答案:

答案 0 :(得分:0)

单元格DataContext的{​​{1}}可能是DataTemplate的一个实例,因为Project的{​​{1}}是一个名为ItemsSource的集合}。

因此,在DataGrid中,Projects上的任何CellTemplate都应引用Path的属性,就像在Binding列中一样:

Project

Projectname是每列的<DataGridTextColumn Width="200" Header="Project" Binding="{Binding Projectname}"> 。上述Project有效,因为DataContextBinding的属性。

所以这应该有效:

Projectname

Project有一个<ItemsConttrol ItemsSource="{Binding Days[0].Employees}" ... 集合。您希望此项目的Project中的第一项Days集合。