【发布时间】:2017-01-28 11:06:36
【问题描述】:
编辑(澄清要求)
我有一个DataGrid,如下所示。 “存储旧 EmpNo 的字段名称”列中的值会根据“新 EmpNo 规则”列中选择的值而变化。为了适应这种情况,DataGridItemsSource 中的每个项目都有自己的TableNameForOldDataCollection。我需要绑定到这个 TableNameForOldDataCollection 而不是不能更改的静态属性。
如果在使用DataGridComboBoxTemplate 时有办法进行此绑定,我会更喜欢。如果没有,我想知道是否可以将DataGridTemplateColumn/ComboBox 模板化为与DataGridComboBoxTemplate 匹配的模板
OP
我有一个场景,我将DataGridComboBoxColumn 用于DataGrid 列之一。在另一列中,我需要使用DataGridTemplateColumn 和ComboBox 来正确绑定到VM 中的动态ItemSource。
DataGridComboBoxColumn(“新 EmpNo 规则”)的样式与 DataGridTemplateColumn 不同,ComboBox(“存储旧 EmpNo 的字段名称”)如下所示:
如何设置DataGridTemplateColumn/ComboBox 的样式以匹配DataGridComboBoxColumn,尤其是在未选择实际单元格时如何隐藏组合框(如“New EmpNo Rule”的第二行)。
编辑(添加DataGrid 代码):
<UserControl.Resources>
<ResourceDictionary>
<CollectionViewSource x:Key="StaticEmpNoRuleCollection" Source="{Binding EmpNoRuleCollection}" />
</ResourceDictionary>
</UserControl.Resources>
....
<DataGrid Name="DataGrid_MultiCompanyInfo"
ItemsSource="{Binding Model.EmpNoOptionsCollection}"
SelectedItem="{Binding SelectedEmpNoOptions}"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False">
<DataGrid.Columns>
<!-- Company -->
<DataGridTextColumn Header="Company"
Binding="{Binding Company}"
IsReadOnly="True" />
<!-- New EmpNo Rule -->
<DataGridComboBoxColumn Header="New EmpNo Rule"
Width="200"
ItemsSource="{Binding Source={StaticResource StaticEmpNoRuleCollection}}"
DisplayMemberPath="Description"
SelectedValueBinding="{Binding SelectedEmpNoRule, UpdateSourceTrigger=PropertyChanged}"/>
<!-- Field Name To Store Old EmpNo -->
<DataGridTemplateColumn Header="Field Name To
Store Old EmpNo"
Width="150" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="OldEmpNo_ComboBox"
Margin="-5,0,0,0"
ItemsSource="{Binding TableNameForOldDataCollection}"
SelectedValue="{Binding TableNameForOldData, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...
</DataGrid.Columns>
</DataGrid>
【问题讨论】:
-
能否请您发布您的 DataGridTemplateColumn 代码?
-
@Kirenenko 请参阅对 OP 的编辑。
-
我认为正确的方法是在“Old EmpNo”上使用DataGridComboBoxColumn,但你应该正确绑定,使用
RelativeSource="{RelativeSource AncestorType={x:Type DataGrid}}"。 -
@Kirenenko 我最初走的这条路线行不通。根据我发现的许多不同的文章,你不能按照你的建议去做,因为 DataGridComboBoxColumn 不是可视化树的一部分(stackoverflow.com/questions/3659970/…)。这就是我必须使用 DataGridTemplateColumn 的原因。此特定列的可选值会根据其他列的选定值而变化。
标签: wpf combobox datagrid datagridcomboboxcolumn datagridtemplatecolumn