WPF Как создать пользовательский DataGrid с помощью пользовательских DataGridCells?

Я хочу создать настраиваемый DataGrid, чтобы пользователи могли прикреплять заметки к каждой ячейке с помощью всплывающего поля ввода. В настоящее время я создал класс CustomDataGrid, унаследованный от DataGrid, с ContextMenu, в котором есть возможность добавить заметку. Когда пользователь выбирает добавление примечания, я нахожу выбранную ячейку, открывается поле ввода и возвращает ответ, и я сохраняю его в списке списков строк, где каждый список строк представляет строку. Однако это не всегда работает, потому что иногда ячейка не выбирается, и я получаю сообщение об ошибке: «Ссылка на объект не установлена ​​на экземпляр объекта». Я думаю о создании класса CustomDataGridCell, унаследованного от DataGridCell, у которого есть собственное ContextMenu и строка примечания. Вопрос в том, как мне сделать все ячейки в моем CustomDataGrid CustomDataGridCell? Есть лучший способ сделать это?

Вот мой текущий класс CustomDataGrid:

public class CustomDataGrid : DataGrid
{
    MenuItem miAddNote;
    List<List<string>> notes;

    public CustomDataGrid()
    {
        notes = new List<List<string>>();

        miAddNote = new MenuItem();
        miAddNote.Click += MiAddNote_Click;
        miAddNote.Header = "Add a note";

        this.ContextMenu = new ContextMenu();
        this.ContextMenu.Items.Add(miAddNote);
    }

    private void MiAddNote_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            int rowIndex = this.SelectedIndex;
            int colIndex = this.SelectedCells[0].Column.DisplayIndex;
            InputBox ib = new InputBox(notes[rowIndex][colIndex]);
            if (ib.ShowDialog() == true)
            {
                notes[rowIndex][colIndex] = ib.Response;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    protected override void OnLoadingRow(DataGridRowEventArgs e)
    {
        base.OnLoadingRow(e);

        int numColumns = this.Columns.Count;
        List<string> newRow = new List<string>();

        for (int i = 0; i < numColumns; ++i)
        {
            newRow.Add("");
        }
        notes.Add(newRow);
    }
}

person Tim Romanski    schedule 22.05.2017    source источник
comment
Imo, часть сетки данных, на которую вам нужно обратить внимание, - это DataGridColumn. Может быть, TemplateColumn уже достаточно. wpf-tutorial.com/datagrid-control/custom-columns   -  person jHilscher    schedule 22.05.2017


Ответы (1)


Вопрос в том, как мне сделать все ячейки в моем CustomDataGrid CustomDataGridCell?

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

Есть лучший способ сделать это?

Вы должны просто проверить, есть ли какие-либо выбранные ячейки, прежде чем пытаться получить к ним доступ:

private void MiAddNote_Click(object sender, RoutedEventArgs e)
{
    int rowIndex = this.SelectedIndex;
    if (rowIndex != -1 && SelectedCells != null && SelectedCells.Count > 0)
    {
        int colIndex = this.SelectedCells[0].Column.DisplayIndex;
        InputBox ib = new InputBox(notes[rowIndex][colIndex]);
        if (ib.ShowDialog() == true)
        {
            notes[rowIndex][colIndex] = ib.Response;
        }
    }
}
person mm8    schedule 22.05.2017