Search code examples
c#wpfdatagrid

Editable DatagridComboBoxColumn in WPF using C#


I'm using WPF DataGrid control with dynamic columns binding at run time.(DataGrid columns are dynamic)

Sample code is as below

.xaml is having below code

 <Style TargetType="ComboBox" x:Key="ComboBoxEditingStyle">
                <Setter Property="ItemsSource" Value="{Binding Path=DefinedFormatters}" />
                <Setter Property="IsDropDownOpen" Value="False" />
                <Setter Property="IsEditable" Value="True" />
                <Setter Property="SelectedValue" Value="Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                <Setter Property="ItemTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=Name}"></TextBlock>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

.xaml.cs file is having below code,

 Binding theBinding  = new Binding();
 theBinding.Mode = BindingMode.TwoWay;
 theBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
 theBinding.ValidatesOnDataErrors = true;

 DataGridComboBoxColumn colSuggestionList = new DataGridComboBoxColumn();

 // theCollection is Collection<string>     
 colSuggestionList.ItemsSource = theCollection;


 colSuggestionList.SelectedValueBinding = theBinding;
 colSuggestionList.Visibility = Visibility.Visible;   
 colSuggestionList.EditingElementStyle = dgMainTemplate.FindResource("ComboBoxEditingStyle") as Style;
 // dgMainTemplate is wpf DataGrid                      
 dgMainTemplate.Columns.Add(colSuggestionList);

Column added properly, but I want to make this column as editable. User should be able to select either existing item from available list or enter a new value which is not exists in available list. Here EditingElementStyle will add editable combobox but items are not showing in combobox until user selects any item.


Solution

  • Finally I got solution to this problem, Modified code is as below,

     <Style x:Key="TextBlockComboBoxStyle" TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ComboBox}">
                                <Label Content="{TemplateBinding Text}" Style="{StaticResource {x:Type Label}}" />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
    
                <Style TargetType="ComboBox" x:Key="ComboBoxEditingStyle">
                    <Setter Property="ItemsSource" Value="{Binding Path=DefinedFormatters}" />
                    <Setter Property="IsDropDownOpen" Value="False" />
                    <Setter Property="IsEditable" Value="True" />
                </Style>
    

    .cs code is,

     Binding theBinding  = new Binding();
     theBinding.Mode = BindingMode.TwoWay;
     theBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
     theBinding.ValidatesOnDataErrors = true;
    
     DataGridComboBoxColumn colSuggestionList = new DataGridComboBoxColumn();
    
     // theCollection is Collection<string>     
     colSuggestionList.ItemsSource = theCollection;
    
    
     colSuggestionList.SelectedValueBinding = theBinding;
     colSuggestionList.Visibility = Visibility.Visible;   
     colSuggestionList.EditingElementStyle = dgMainTemplate.FindResource("ComboBoxEditingStyle") as Style;
    
     colSuggestionList.EditingElementStyle = dgMainTemplate.FindResource("ComboBoxEditingStyle") as Style;
     colSuggestionList.ElementStyle = dgMainTemplate.FindResource("TextBlockComboBoxStyle") as Style;
     // dgMainTemplate is wpf DataGrid                      
     dgMainTemplate.Columns.Add(colSuggestionList);