Как разработать вспомогательные типы данных для диалогового окна WPF с привязкой к данным с помощью кнопок Ok / Cancel? - PullRequest
3 голосов
/ 07 декабря 2008

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

Я хочу создать простую форму WPF, которую можно использовать для редактирования записи в таблице через классы, созданные в ORM. Я хочу, чтобы эта форма поддерживала типичную семантику OK / Cancel. Я создал форму, как я считаю, типичным способом, используя привязку данных TwoWay к соответствующим полям для привязки к экземпляру объекта из 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. (Это личный проект, который я использую для изучения обеих технологий.)

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

Ответы [ 2 ]

7 голосов
/ 07 декабря 2008

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

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

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

1 голос
/ 07 декабря 2008

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

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

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

Хотя я не знаю, нравится ли мне такой же возврат в базу данных.

...