Относительно пункта 1): Да, используйте ViewModel для привязки к пользовательскому интерфейсу, а не к DTO.Это основная идея, помогающая отделить данные от представления в MVVM.
Что касается пунктов 2) и 3) Я предлагаю вам реализовать интерфейс IEditableObject
в ваших моделях представления, возможно, в общем базовом классе..
Этот интерфейс предоставляет методы BeginEdit(), CancelEdit(), and EndEdit()
.Использование этих методов дает вам четкий и читаемый контроль над тем, когда какой объект изменяется и когда отправлять эти изменения, например, в службу или базу данных.
Кроме того, реализация этих методов дает вам механизм для обработки этих различныхВерсии данных, такие как "ViewValue" и "ServiceValue".Вы можете создать локальную копию ServiceValue в качестве запасного при вызове метода BeginEdit()
и вызвать это локальное запасное значение при вызове метода CancelEdit()
.Если вызывается EndEdit()
, это время для отправки значений обратно в службу, после чего сохраняется текущее значение в этом локальном временном значении в качестве нового запасного значения.
Изменить надобавить ответ по пункту 1)
Я не уверен, является ли это «наилучшей практикой», но, по крайней мере, это то, что мы будем делать на работе.
Обычно мы организуемViewModels таким образом, что у нас есть одна ViewModel для представления, которая содержит всю информацию для определенного представления.Давайте назовем это «основной ViewModel».Если нам нужна иерархия представлений, мы реализовали бы иерархию моделей представления, которые следуют той же иерархии.
В случае, подобном вашему, мы поместили бы DataGrid в другой UserControl
, который содержится в основном представлении.Основная ViewModel будет содержать другую ViewModel, которая снова содержит данные, необходимые для DataGrid.Эта ViewModel будет установлена как DataContext этого DataGrid-UserControl.Таким образом, вы по-прежнему сохраняете чистое разделение по одному на ViewModel-per-View.
В этом случае можно настроить дополнительное форматирование данных в DataGrid va Templates
.