我尽可能简化了这一点。我的窗口中有DataGrid
:
<DataGrid
x:Name="myDataGrid"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
CanUserSortColumns="False"
SelectionMode="Single"
SelectionUnit="FullRow"
GridLinesVisibility="Horizontal"
ItemsSource="{Binding ValuesDataTable}"
CellEditEnding="myDataGrid_CellEditEnding"/>
我的DataContext
是班级ViewModel
:
enum SomeEnum
{
Choice1 = 0,
Choice2
}
class ViewModel
{
public ViewModel()
{
var dataTable = new DataTable();
var column1 = dataTable.Columns.Add();
column1.DataType = typeof(string);
var column2 = dataTable.Columns.Add();
column2.DataType = typeof(SomeEnum);
dataTable.Rows.Add(new object[] { "Name 1", SomeEnum.Choice1 });
dataTable.Rows.Add(new object[] { "Name 2", SomeEnum.Choice2 });
this.ValuesDataTable = dataTable;
}
public DataTable ValuesDataTable { get; private set; }
}
在我的窗口代码隐藏中,我有这个事件处理程序:
private void myDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
if (e.EditAction == DataGridEditAction.Commit)
{
var dataGrid = (DataGrid)sender;
dataGrid.CancelEdit();
}
}
当我运行应用程序列时,1按预期工作(它正确显示值,我可以开始编辑,当我尝试提交时编辑取消)。但是,第2列不显示值。当您尝试编辑它时,会显示带有两个Enum选项的下拉框,但是当您尝试提交它时,它会执行CancelEdit
,在WPF代码中的某处会抛出异常并中断绑定。例外是:
System.NotSupportedException:
EnumConverter cannot convert from System.Int32
我认为DataGrid
正在将DataTable
中的Enum列的值作为int
读取,并且可能需要一个字符串。有什么方法可以解决这个问题吗?
更新
我发现如果我处理DataGrid.LoadingRow
事件并获得ItemData
数组,则第二列已成为Int32
而不是枚举。尝试将其强制转换为正确的类型并没有帮助:
private void myDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
var row = e.Row.Item as DataRowView;
var dataRow = row.Row;
var itemArray = dataRow.ItemArray;
// BTW, this doesn't help:
itemArray[1] = (SomeEnum)itemArray[1];
dataRow.ItemArray = itemArray;
}
答案 0 :(得分:0)
我已经弄清楚为什么会这样。问题出在DataTable
,特别是DataRow
,而不是WPF DataGrid
。
如果我更改了视图模型中的行,我在DataTable
添加了一行:
var r1 = dataTable.Rows.Add(row1);
...然后检查r1
,特别是r1.ItemArray[1]
,它的类型为int
,而不是SomeEnum
。这意味着它已经丢失了类型信息。
答案似乎是我必须使用我定义的某个类的ObservableCollection
。如果你在该类上有一个枚举的属性类型,它就可以工作。