Search code examples
c#.net-3.5wpfdatagridwpftoolkitdatagridcomboboxcolumn

Is it possible to exposed the DataGridComboBoxColumn immediately?


Is it possible to have a WPF Toolkit Data Grid's DataGridComboBoxColumn "exposed" when the Data Grid loads? By default you have to click in the cell to expose the combo box. I'd like the user to see that the combo box is available without having to click in the cell. I would prefer that the combo box be immediately available and the first click in the cell makes the combo box actually drop down. Currently you have to click the cell and then click the combo box drop down to expose the values.

Unwanted appearance

V.S.

Correct appearance

XAML:

<dg:DataGridComboBoxColumn x:Name="ctrlStatus" Header="Status" Width="Auto" SelectedValueBinding="{Binding Port}" SelectedValuePath="Status">
  <dg:DataGridComboBoxColumn.CellStyle>
    <Style TargetType="dg:DataGridCell">
      <EventSetter Event="Selector.SelectionChanged" Handler="SelectionChanged"/>
    </Style>
  </dg:DataGridComboBoxColumn.CellStyle>
</dg:DataGridComboBoxColumn>

Code Behind:

List<string> _statusList;
public List<string> StatusList
{
  get 
  {
      return _statusList; 
  }
  set
  {
    _statusList = value;
    ctrlStatus.ItemsSource = _statusList;
  }
}

Thanks, GAR8

Final SOLUTION: XAML

<telerik:GridViewComboBoxColumn Header="Status">
  <telerik:GridViewComboBoxColumn.CellTemplate>
    <DataTemplate>
      <telerik:RadComboBox ItemsSource="{Binding StatusList,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}" SelectedValue="{Binding Port}" SelectedValuePath="Status" SelectionChanged="SelectionChanged"/>
    </DataTemplate>
  </telerik:GridViewComboBoxColumn.CellTemplate>
</telerik:GridViewComboBoxColumn>

Code Behind:

List<string> _statusList;
public List<string> StatusList 
{
  get { return _statusList;  }
  set { _statusList = value; }
}

Solution

  • You can use a DataGridTemplateColumn and place a ComboBox as the cell edit template without specifying a non-edit template. This will let the DataGrid use always the ComboBox.

    Update
    As requested in your comment, below an example. Please note that the example is not optimal and I would have choosen another design, but I have done it in a way so that it should integrate in your solution without bigger problems. I have not tested it. Make a comment if they are errors in.

    <DataGridTemplateColumn>    
         <DataGridTemplateColumn.CellEditingTemplate >       
               <DataTemplate>         
                     <ComboBox x:Name="ctrlStatus" 
                            SelectedValueBinding="{Binding Port}" 
                            SelectedValuePath="Status">  
                            SelectionChanged="SelectionChanged"
                            ItemsSource="{Binding StatusList,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}" 
                      />       
               </DataTemplate>    
         </DataGridTemplateColumn.CellEditingTemplate>
    </DataGridTemplateColumn>
    

    To use the above code, StatusList must implement change notification. If your DataGrid is not in aWindow but in another class such as in a UserControl, replace the type name in the relative source.