#c# #wpf #xaml
Вопрос:
У меня есть выпадающее меню (выпадающее меню) из нескольких таблиц. Каждая таблица имеет тип, доступный для данных. Затем у меня есть сетка данных, свойство ItemsSource которой привязано к выбранной таблице из выпадающего списка. У меня нет сопоставленного класса для самого элемента, потому что я не знаю схему таблицы во время компиляции. Ниже приведен мой XAML-код инструмента:
<Grid>
<!-- Grid definitions -->
<ComboBox...
ItemsSource="{Binding Tables, Mode=OneWay}"
DisplayMemberPath="Key"
SelectedValuePath="Value"/>
<DataGrid...
CanUserAddRows="True"
AutoGenerateColumns="True"
ItemsSource="{Binding ActiveTable.DefaultView}" />
<!-- Buttons to add/edit/remove/save records -->
</Grid>
Теперь, как вы можете видеть из XAML, у меня есть пара кнопок для работы с данными таблицы. В моих таблицах есть набор первичных ключей, который не позволяет мне иметь пустые ячейки. Мне действительно не нужны пустые ячейки в начале. Идея, которой я пытаюсь достичь, заключается в следующем:
- Создайте новую пустую строку и отметьте фон строки зеленым цветом. Это должно начать редактирование строки и дождаться ввода пользователя. Как только пользователь закончит вводить данные, команда сохраняется в списке команд (поэтому изменения визуально отображаются в таблице, но элементы пока не следует изменять).
- Как только пользователь нажимает кнопку Применить, несохраненные изменения должны быть зафиксированы в таблице. Таким образом, если пользователь добавил новую строку, она действительно должна быть добавлена в таблицу, и зеленый фон теперь должен измениться на значение по умолчанию.
Аналогично описанному сценарию добавления, пользователь может выбрать строку для удаления, строка будет отмечена красным цветом, но на самом деле еще не удалена. Вместо этого команда удаления будет записана и применена только после того, как пользователь нажмет кнопку Применить. В случае, если пользователь изменяет строку, строка должна быть перекрашена в оранжевый цвет (например), а команда редактирования будет записана, когда пользователь закончит изменять строку. Как только пользователь нажмет кнопку Применить, команда редактирования должна быть фактически применена.
Ниже приведен мой код для обработки команд (ViewModel):
private readonly List<DBCommand> _unsavedCommands;
public IDictionary<string, DataTable> Tables { get; private set; }
public DataTable ActiveTable { get; private set; }
...
private void AddRecord(DataGrid dataGrid)
{
NewRowAdded?.Invoke(dataGrid, null);
var command = DBCommand.Create(...);
_unsavedCommands.Add(command);
}
И Код Позади:
private void ActiveTable_NewRowAdded(object sender, DataTableNewRowEventArgs e)
{
int newItemIndex = dataGrid.Items.Count - 1;
var item = dataGrid.Items[newItemIndex];
dataGrid.ScrollIntoView(item);
dataGrid.SelectedIndex = newItemIndex;
dataGrid.BeginEdit();
var row = (item as DataRowView).Row;
row.BeginEdit();
}
Проблема с приведенным выше кодом заключается в том, что объект типа NewItemPlaceholder создается, когда я нажимаю кнопку Добавить запись, а затем происходит сбой инструмента.
Может ли кто-нибудь указать мне, как добиться желаемого поведения?
Ответ №1:
Таким образом, проблема заключалась в том, что я создавал строку программно, и созданная строка не была согласована со схемой таблицы. Я решил использовать поведение по умолчанию для создания новых строк из пользовательского интерфейса.