データグリッドセルにコレクションのコンテンツを表示するとします。特別なのは、列ヘッダーが特定のコレクションアイテム(つまり、各勤務日に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
ためItemsSource
がProjects
と呼ばれるコレクションですので
<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>
OK、 'DataGrid'の' ItemsSource'が 'Projects'という名前のコレクションであるため、' DataTemplate'セルの 'DataContext'はおそらく' Project'の一つのインスタンスです。テンプレートコンテンツを ''で一時的に置き換えることでこれを確認すると、 'Project'という完全に解決されたクラス名が得られるでしょう。 OK。これは、ほぼ確実に 'DataContext'です。したがって、 'CellTemplate'では' Binding'上の 'Path'は' Project'のプロパティとして解決されます。これはうまくいくはずです: ''。 –
私の懸念はこれです: 'DataContext.Planning.Projects.Days [0] .Employees'。その道には、データコンテキストがどのように機能するかについての誤解の結果である可能性がありますが、ビューモデル設計におけるいくつかの慣習的でない選択の産物でもあります。 'Project'は' DataContext'プロパティを持っていますか?私はそれをviewmodelプロパティ名として使用することをお勧めします。私は 'Projects.Days'のどちらを作るべきかわからない。 'Projects'は一般的なコレクションではありませんか?私はそれが 'ObservableCollection'であることを願っています。 –
あなたは正しいです: '