我有3张桌子: Item - 这是DataContext - 它有一个导航列Group 组 - 具有导航列类别。
我希望在DataGrid中有两个(Category& Group)列,当我选择一个类别时,它应该只显示在group col中的Category.Groups。
以下是我正在处理的代码:
<tk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}">
<tk:DataGrid.Columns>
<!--Works-->
<tk:DataGridComboBoxColumn
Header="Categroy"
DisplayMemberPath="Title"
SelectedValuePath="CategoryId"
SelectedValueBinding="{Binding Group.Category.CategoryId}"
ItemsSource="{Binding Context.Categories,
Source={x:Static Application.Current}}"
/>
<!--Look at these two things:-->
<!--This does work-->
<tk:DataGridTemplateColumn>
<tk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ItemsControl
ItemsSource="{Binding Group.Category.Groups}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type data:Group}">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</tk:DataGridTemplateColumn.CellTemplate>
</tk:DataGridTemplateColumn>
<!--But this does NOT work, even it's the same source-->
<!--Notice I even tried a dummy converter and doesnt reach there-->
<tk:DataGridComboBoxColumn
Header="Group"
DisplayMemberPath="Title"
SelectedValuePath="GroupId"
ItemsSource="{Binding Group.Category.Groups,
Converter={StaticResource DummyConverter}}"
SelectedValueBinding="{Binding Group.GroupId}"
/>
</tk:DataGrid.Columns>
</tk:DataGrid>
更新
你会说问题是ItemsSource属性不能设置为非静态绑定吗?
我怀疑是因为即使我使用{Binding}
将ItemsSource设置为DummyConverter
,它也不会在转换器中停止;并且在类别ComboBox中它工作正常。
答案 0 :(得分:28)
数据网格中的列没有datacontext,因为它们从未添加到可视树中。听起来有点奇怪,但看看vince's blog,它有一个很好的视觉布局的例子。绘制网格后,单元格具有数据上下文,您可以使用常规绑定(而非静态资源)在其中设置组合框项目源。
您可以访问组合框项目源:
<dg:DataGridComboBoxColumn>
<dg:DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=MyBindingPath}" />
</Style>
</dg:DataGridComboBoxColumn.EditingElementStyle>
</dg:DataGridComboBoxColumn>
答案 1 :(得分:2)
我正在使用MVVM,我想将列的ItemSource
绑定到窗口数据上下文中的对象集合。在找到this answer之前,我必须尝试过10种不同的方法并且没有效果。
诀窍是在网格外定义CollectionViewSource
,然后使用StaticResource
在网格内引用它。例如,
<Window.Resources>
<CollectionViewSource x:Key="ItemsCVS" Source="{Binding MyItems}" />
</Window.Resources>
<!-- ... -->
<DataGrid ItemsSource="{Binding MyRecords}">
<DataGridComboBoxColumn Header="Column With Predefined Values"
ItemsSource="{Binding Source={StaticResource ItemsCVS}}"
SelectedValueBinding="{Binding MyItemId}"
SelectedValuePath="Id"
DisplayMemberPath="StatusCode" />
</DataGrid>