Я хочу создать настраиваемый 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);
}
}