无法从DataGridTemplateColumn获取确切的WPF DataGrid嵌入控件类型 public void MouseSingleClickEditable(对象发送器,MouseButtonEventArgs e) { 如果(!datagrid.HasItems)| | datagrid.SelectedIndex

无法从DataGridTemplateColumn获取确切的WPF DataGrid嵌入控件类型 public void MouseSingleClickEditable(对象发送器,MouseButtonEventArgs e) { 如果(!datagrid.HasItems)| | datagrid.SelectedIndex,wpf,mvvm,wpf-controls,wpfdatagrid,wpf-4.0,Wpf,Mvvm,Wpf Controls,Wpfdatagrid,Wpf 4.0,在我的WPF Datagrid中有2个日期选择器、复选框和一个组合框,但在定位列类型时,我只将其作为DataGridTemplateColumn而不是DataGridDatePickerColumn或DataGridComboboxColumn类型。如何从DataGridTemplate列中提取控件的确切类型。public void MouseSingleClickEditable(对象发送器,MouseButtonEventArgs e){ public void MouseSingleCli

在我的WPF Datagrid中有2个日期选择器、复选框和一个组合框,但在定位列类型时,我只将其作为DataGridTemplateColumn而不是DataGridDatePickerColumn或DataGridComboboxColumn类型。如何从DataGridTemplate列中提取控件的确切类型。

public void MouseSingleClickEditable(对象发送器,MouseButtonEventArgs e){
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;
        }
    }
}
var datagrid=new datagrid(); 如果(!datagrid.HasItems)| | datagrid.SelectedIndex<0)返回; DataGridColumn clmn=datagrid.CurrentColumn; 如果(clmn!=null){ if(clmn是DataGridCheckBoxColumn){ //做点什么 }else if(clmn是DataGridTemplateColumn){ var templateColumn=(DataGridTemplateColumn)clmn; var rootControlOfCellTemplate=templateColumn.CellTemplate.LoadContent(); var rootControlOfCellEditingTemplate=templateColumn.CellEditingTemplate.LoadContent(); //现在可以检查模板的类型。CellEditingTemplate用于编辑模式下的模板,CellTemplate用于“非编辑”模式 //比如说 if(rootControlOfCellTemplate为按钮){ //做点什么 } if(CelleditingTemplate的根控件为日期选择器){ //做点什么 } } } }

注意我是如何检查类型的。通常,您应该这样做,而不是通过硬编码字符串。

感谢您的响应,但它会显示警告消息“给定的表达式永远不是提供的(System.Windows.Controls.DatePicker)类型”,再次感谢您,但这里VisualTree为我返回null。所以它引发了空引用异常。我的部分还有什么需要研究的吗?您是否为DataGridTemplate列设置了CellTemplate和/或CellEditingTemplate?是的,对于Combobox,我设置了CellTemplate,对于DatePicker,我在XAML设计部分设置了bot CellTemplate和CellEditingTemplate。显然,这是已知的行为。我又改了密码。现在试试看。
   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
                    }
                }
            }
        }