Вопрос

On each DataGridColumnHeader I have a button that I use to open a popup. As a parameter it sends the column's bound Property name to the ICommand in my ViewModel.

This works well for any DataGridTextColumn however when it comes to a DataGridComboBoxColumn the structure is different.

How would I solve this?

<Button Command="{Binding DataContext.OpenFilterCommand, 
                  RelativeSource={RelativeSource AncestorType=UserControl}}"
        CommandParameter="{Binding Column.Binding.Path.Path, 
                  RelativeSource={RelativeSource Mode=TemplatedParent}}"/>

Problem Column Definition

<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>
Это было полезно?

Решение

Like I mentioned in previous question here that how to get value for DataGridTextColumn where i suggested to use Column.Binding.Path.Path to get bound property name.

But that won't work in this case since DataGridComboBoxColumn does not have any binding property. If syntax is like the one you mentioned in question above, you can get like this:

For SelectedValue i.e. Company:

<Button Command="{Binding DataContext.OpenFilterCommand, 
                  RelativeSource={RelativeSource AncestorType=UserControl}}"
        CommandParameter="{Binding 
                   Column.EditingElementStyle.Setters[1].Value.Path.Path, 
                  RelativeSource={RelativeSource Mode=TemplatedParent}}"/>

EXPLANATION

TemplatedParent (DataGridColumnHeader) --> Column (DataGridComboBoxColumn) --> EditingElementStyle(EditingElementStyle) --> Setters(1) (get first setter from style) --> Value (Setter Value) --> Path (PropertyPath) --> Path (Actual PropertyName)

If you want to get ItemsSource property name, replace Setters[1] with Setters[0].

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top