问题结合DataGridComboBoxColumn.ItemsSource
-
19-09-2019 - |
题
我有3个表: 物品 - 这是DataContext的 - 它有一个导航栏组 组 - 具有导航列类别
我想在数据网格两者(类别及集团)的列,并且当我选择一个类别就应该在组栏仅显示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属性不能被设置为一个非静态绑定?
我怀疑是因为即使我设置的ItemsSource与{Binding}
它不会在变频器停止DummyConverter
;并在类别组合框它工作正常。
解决方案
在数据网格中的列不具有的datacontext,因为它们是从不添加到视件树。听起来有点不可思议,但看看的 Vince的博客,它得到了可视化布局的一个很好的例子。一旦网格画出的细胞具有数据上下文并可以在其中使用普通绑定设置组合框项目源(未静态资源..)
可以访问该组合框项目源作为这样:
<dg:DataGridComboBoxColumn>
<dg:DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=MyBindingPath}" />
</Style>
</dg:DataGridComboBoxColumn.EditingElementStyle>
</dg:DataGridComboBoxColumn>
其他提示
我使用MVVM,我想列的ItemSource
绑定到窗口数据上下文对象的集合。我必须尝试了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>
不隶属于 StackOverflow