Я максимально упростил это.У меня есть 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
считывает значение столбца Enum из 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;
}