WPF4 DataGrid не может отобразить или отменить редактирование столбца Enum? - PullRequest
0 голосов
/ 09 марта 2011

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

1 Ответ

0 голосов
/ 09 марта 2011

Я понял, почему это происходит. Проблема в DataTable, а именно в DataRow, а не в WPF DataGrid.

Если я изменю строку в моей модели представления, где я добавлю строку к DataTable:

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

... и затем проверьте r1, в частности r1.ItemArray[1], это тип int, а не SomeEnum. Это означает, что он уже потерял информацию о типе.

Ответ, похоже, заключается в том, что я должен использовать ObservableCollection некоторого класса, который я определяю. Если у вас есть тип свойства enum для этого класса, он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...