在每个DataGridColumnHeader上,我有一个用于打开弹出窗口的按钮。作为参数,它将列的绑定属性名称发送到我的ViewModel中的ICommand。
这适用于任何DataGridTextColumn但是当涉及DataGridComboBoxColumn时,结构是不同的。
我该如何解决这个问题?
<Button Command="{Binding DataContext.OpenFilterCommand,
RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding Column.Binding.Path.Path,
RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
问题列定义
<DataGridComboBoxColumn Header="Company" >
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.CompanyCollection}"/>
<Setter Property="IsReadOnly" Value="True"/>
<Setter Property="SelectedValue" Value="{Binding Company}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.CompanyCollection}"/>
<Setter Property="SelectedValue" Value="{Binding Company}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
答案 0 :(得分:2)
就像我在上一个问题here中提到的那样,如何获得DataGridTextColumn
的值,我建议使用Column.Binding.Path.Path
获取绑定的属性名称。
但是在这种情况下,由于DataGridComboBoxColumn
没有任何绑定属性,因此无法工作。如果语法与您上面提到的语法类似,您可以这样:
对于SelectedValue
,即Company
:
<Button Command="{Binding DataContext.OpenFilterCommand,
RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding
Column.EditingElementStyle.Setters[1].Value.Path.Path,
RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
<强>说明强>
TemplatedParent( DataGridColumnHeader ) - &gt;列( DataGridComboBoxColumn ) - &gt; EditingElementStyle( EditingElementStyle ) - &gt; Setters(1)(从样式获得第一个setter) - &gt;值( Setter Value ) - &gt;路径( PropertyPath ) - &gt;路径(实际PropertyName )
如果您想获取ItemsSource
媒体资源名称,请将Setters[1]
替换为Setters[0]
。