Как создать резервные типы данных для диалогового окна WPF с привязкой к данным с кнопками Ok / Cancel?

Я создал таблицу в Microsoft Sql CE, которую использую для хранения некоторых данных. Я создал ORM через SqlMetal, и я вставил источник данных в свой проект WPF.

Я хочу создать простую форму WPF, которую можно использовать для редактирования записи в таблице с помощью классов, сгенерированных ORM. Я хочу, чтобы эта форма поддерживала типичную семантику ОК / Отмена. Я создал форму, как мне кажется, типичным способом, используя двустороннюю привязку данных к соответствующим полям для привязки к экземпляру объекта из ORM. Например, учитывая объект в ORM, который имеет свойство «TaskName», я включил в свою форму WPF следующее:

<Label Grid.Column="0" Grid.Row="0" >
    Name:
</Label>
<TextBox Name="txtName" Grid.Column="1" Grid.Row="0" 
         Text="{Binding TaskName, Mode=TwoWay}" AcceptsReturn="False"
         MaxLines="1" />

Это в сочетании с назначением DataContext в коде:

var newRow = new OrmGeneratedClass();
// Populate default values on newRow, e.g.    
detailWindow.DataContext = newRow;
detailWindow.ShowDialog();

может достаточно хорошо работать для создания новой строки. Все изменения, внесенные через форму, немедленно отражаются в базовом классе OrmGeneratedClass. Проблема в том, что нет немедленной поддержки отмены изменений, если, например, OrmGeneratedClass заполнен ранее сохраненными значениями.

Каков хороший дизайн для этого сценария, или я неправильно его спроектировал, прежде чем перейду к этому пункту? Я новичок в WPF и аспектах интеграции источника данных Sql Server / ORM. (Это личный проект, который я использую для изучения обеих технологий.)

У меня есть пара мыслей, и я вставлю их в ответы


person Greg D    schedule 07.12.2008    source источник


Ответы (2)


У Пола Стовелла есть блестящая статья о создании адаптера для интерфейса IEditableObject, который позволяет связывать данные и разрешать применение / откат.

http://www.paulstovell.com/blog/runtime-ui-binding-behavior-ieditableobject-adapter

Адаптер оборачивается вокруг вашего объекта ORM и автоматически кэширует изменения, чтобы вы могли либо применить изменения, либо вернуться к исходному.

person Cameron MacFarland    schedule 07.12.2008
comment
Блестяще! Похоже, это именно то, что я ищу. Спасибо! - person Greg D; 07.12.2008
comment
Да, я нашел эту статью некоторое время назад и использовал ее в нескольких проектах. Сэкономил мне кучу времени. - person Cameron MacFarland; 07.12.2008
comment
Это работает, если вы работаете с набором сущностей, для которых изменения, внесенные в один, не должны вызывать изменения в другом (непосредственно перед вызовом EndEdit). Допустим, у вас есть Orders и OrderItems в одной и той же форме. Если вам необходимо обновить информацию о клиенте в заказе, и для каждого элемента заказа требуется скидка на основе некоторой стоимости клиента (код скидки), тогда элементы заказа не будут обновлять свою общую сумму до тех пор, пока не сделаете заказ. форма) называется. Таким образом, пользователь не увидит немедленной обратной связи об изменении order_total при смене клиента. - person Dasith Wijes; 25.11.2015

Одним из возможных решений было бы искать результат отмены в диалоговом окне и, используя первичный ключ объекта ORM, извлекать данные из базы данных каждый раз, когда пользователь отменяет, чтобы убедиться, что объект содержит значение, которое он имел в базе данных. Это предполагает, что последнее подтвержденное значение уже было сохранено в базе данных. (Вероятно, справедливое предположение в такой простой программе.)

Это может выглядеть примерно так (не скомпилированный) код:

var existingRow = GetExistingRow(someConditionOrWhatever);
detailWindow.DataContext = existingRow;
if(!detailWindow.ShowDialog())
{
    existingRow = GetExistingRow(someConditionOrWhatever);
}

Но я не знаю, нравится ли мне так обращаться к базе данных.

person Greg D    schedule 07.12.2008
comment
groups.google.com.au/ group / wpf-scheme / web / включает в себя несколько полезных рекомендаций, в том числе лучшую технику для назначения DataContext, которую я использую в вопросе. - person Greg D; 26.01.2009