Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to bind collection to WPF:DataGridComboBoxColumn

Tags:

I have a simple object like:

class Item
{
  ....

  public String Measure { get; set; }
  public String[] Measures {get; }
}

Which I am trying to bind to a DataGrid with two text columns and a combo box column. For the combo box column, property Measure is the current selection and Measures the possible values.

My XAML is:

<DataGrid Name="recipeGrid" AutoGenerateColumns="False" 
          CellEditEnding="recipeGrid_CellEditEnding" CanUserAddRows="False"
          CanUserDeleteRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Food" Width="Auto"
                            Binding="{Binding Food.Name}" />
        <DataGridTextColumn Header="Quantity" IsReadOnly="False"
                            Binding="{Binding Quantity}" />

        <DataGridComboBoxColumn Header="Measure" Width="Auto"
                                SelectedItemBinding="{Binding Path=Measure}"
                                ItemsSource="{Binding Path=Measures}" />

    </DataGrid.Columns>
</DataGrid>

The text column are displayed just fine but the combobox is not - the values are not displayed at all. The binding error is:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Measures; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=11497055); target property is 'ItemsSource' (type 'IEnumerable')

How do I fix this?

like image 727
georgiosd Avatar asked May 22 '10 23:05

georgiosd


2 Answers

This is hands down the best solution:

http://wpfthoughts.blogspot.com/2015/04/cannot-find-governing-frameworkelement.html

The idea here is that you declare a CollectionViewSource as a static resource and then declaratively bind it to ItemsSource of the DataGridComboBoxColumn.

Create and bind a static CollectionViewSource:

 <Page.Resources>
     <CollectionViewSource x:Key="Owners" Source="{Binding Owners}"/>
 </Page.Resources>

And then bind your target ItemsSource:

ItemsSource="{Binding Source={StaticResource Owners}}"
like image 83
nh43de Avatar answered Oct 15 '22 14:10

nh43de


The problem lies in that Columns does no inherit DataContext.

See more here Binding in a WPF data grid text column

here blogs.msdn.com/vinsibal/archive/2008/12/17/wpf-datagrid-dynamically-updating-datagridcomboboxcolumn.aspx

and here http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

like image 21
ThomasAndersson Avatar answered Oct 15 '22 15:10

ThomasAndersson