Вы можете использовать любую модель, которая вам удобна, да, все ваши свойства будут нуждаться в поведении INotifyPropertyChanged. Как это повлияет на уровень сервиса, зависит только от вашей реализации.
Я предполагаю, что вы полагаете, что связываете свои DTO с вашей точки зрения?
Насколько я понимаю, существует несоответствие между уровнями приложения, которое является вашим
Модель предметной области, вероятно, выглядит аналогично вашей реляционной модели, с небольшими, но существенными отличиями. Существует также
несоответствие между моделью предметной области и вашим DTO (объекты могут быть сведены, вычисленные свойства и т. д., ...). Соблазнительно привязывать напрямую к DTO, поскольку они, вероятно, предназначены для того, чтобы иметь то, что вам нужно для конкретной операции, однако существует также несоответствие между DTO и тем, что необходимо представлению для достижения желаемого результата. Вот тут-то и появляется модель представления. Модель представления отвечает за передачу свойств DTO в представление, отвечает за оповещение представления о наличии ошибок проверки и направляет команды соответствующему обработчику (Сохранить, Удалить и т. Д.). ...).
Я склонен настраивать вещи следующим образом:
// POCO object. Serializable.
public class AddressDto
{
public int Id { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
// IDataErrorInfo for validation.
public class AddressViewModel : INotifyPropertyChanged, IDataErrorInfo
{
private readonly AddressDto addressDto;
public AddressViewModel(AddressDto addressDto)
{
this.addressDto = addressDto;
}
public int Id { /* get and set for property changed event and update dto */ }
public string Street { /* get and set for property changed event and update dto */ }
public string City { /* get and set for property changed event and update dto */ }
public string Country { /* get and set for property changed event and update dto */ }
...
// IDataErrorInfo implementation
}
public class EditAddressViewModel : INotifyPropertyChanged
{
public AddressViewModel Address { /* get and set for property changed event */ }
public ICommand Save { /* setup command */ }
public ICommand Cancel { /* setup command */ }
private void Save()
{
}
private void Cancel()
{
}
}
Ваш EditAddressView будет затем связываться с EditAddressViewModel. По сути, все поведение вашего пользовательского интерфейса должно быть выражено в терминах вашей модели представления.
Да, это означает дополнительную работу, однако есть вещи, которые вы можете сделать, чтобы немного упростить вещи (генерация кода и т. Д.). На самом деле я работаю над библиотекой, цель которой - упростить весь процесс MVVM, используя свободный API. Проверьте это в http://fluentviewmodel.codeplex.com/