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