【发布时间】:2011-03-09 17:13:48
【问题描述】:
我已尽可能简化了这一点。我的窗口中有这个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 中读取枚举列的值作为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;
}
【问题讨论】:
-
你不会像那样将整数转换为枚举,你试过 enum.parse 吗?
-
@Davide Piras - enum.Parse 接受一个字符串。是的,我试过了,并且在重新设置 itemArray 之前验证了它是正确的。另外,如果您要转换的对象是 int,我很确定您可以通过这种方式转换枚举。
标签: c# wpf mvvm datagrid enums