Search code examples
wpfmvvmwpf-controlswpfdatagridwpf-4.0

Unable to get exact WPF DataGrid embedded control type From DataGridTemplateColumn


public void MouseSingleClickEditable(object sender, MouseButtonEventArgs e)
{

    if ((!datagrid.HasItems) || datagrid.SelectedIndex < 0) return;

    DataGridColumn clmn = datagrid.CurrentColumn;
    if (clmn != null)
    {
        String columnType = clmn.GetType().Name;

            switch (columnType)
            {
                case "DataGridTemplateColumn":
                case "DataGridCheckBoxColumn":
                    row = (DataGridRow)datagrid.ItemContainerGenerator.ContainerFromItem(datagrid.Items[datagrid.SelectedIndex]);
                    if (!row.IsEditing)
                    {

                        datagrid.IsReadOnly = false;
                        datagrid.BeginEdit();
                    }

                    break;
                default:
                    break;
        }
    }
}

I have 2 DatePickers, Checkbox and a combobox in my WPF Datagrid but while geeting the column type I am getting it only as DataGridTemplateColumn instead of type DataGridDatePickerColumn or DataGridComboboxColumn. How to extract the exact type of Control from the DataGridTemplateColumn.


Solution

  •    public void MouseSingleClickEditable(object sender, MouseButtonEventArgs e) {
                var datagrid = new DataGrid();
                if ((!datagrid.HasItems) || datagrid.SelectedIndex < 0) return;
    
                DataGridColumn clmn = datagrid.CurrentColumn;
                if (clmn != null) {
                    if (clmn is DataGridCheckBoxColumn) {
                        //do something
                    } else if (clmn is DataGridTemplateColumn) {
                        var templateColumn = (DataGridTemplateColumn)clmn;
    
                        var rootControlOfCellTemplate = templateColumn.CellTemplate.LoadContent();
                        var rootControlOfCellEditingTemplate = templateColumn.CellEditingTemplate.LoadContent();
                        // you can now check for types of the template. CellEditingTemplate is for template in edit mode, and CellTemplate for "non-edit" mode
                        // for example
                        if (rootControlOfCellTemplate is Button) {
                            //do something
                        }
                        if (rootControlOfCellEditingTemplate is DatePicker) {
                            //do something
                        }
                    }
                }
            }
    

    Note how I check for types. Normally you should do it like this, not by hard-coded strings.