WPF4 DataGrid无法显示或枚举Enum列的CancelEdit?

时间:2011-03-09 17:13:48

标签: c# wpf mvvm datagrid enums

我尽可能简化了这一点。我的窗口中有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;
}

1 个答案:

答案 0 :(得分:0)

我已经弄清楚为什么会这样。问题出在DataTable,特别是DataRow,而不是WPF DataGrid

如果我更改了视图模型中的行,我在DataTable添加了一行:

var r1 = dataTable.Rows.Add(row1);

...然后检查r1,特别是r1.ItemArray[1],它的类型为int,而不是SomeEnum。这意味着它已经丢失了类型信息。

答案似乎是我必须使用我定义的某个类的ObservableCollection。如果你在该类上有一个枚举的属性类型,它就可以工作。