Одна из идей MVVM состоит в том, чтобы отделить уровень представления от уровня данных. Это дает вам возможность изменять данные, с которыми работает уровень представления, без изменения данных уровня данных.
Таким образом, данные с уровня представления записываются на уровень данных только по запросу пользователя. Ваше избыточное свойство FirstName работает как граница слоя, что дает вам гибкость для реализации чего-то вроде простого «отменить все изменения».
Рассмотрите возможность использования универсального ValueViewModel, который обрабатывает уведомление об изменениях значений, поскольку они требуются для привязки данных. При таком подходе модель вашего вида будет выглядеть примерно так:
public class PersonViewModel : INotifyPropertyChanged, IDataErrorInfo
{
private Person _person;
[Required] //This seems redundent...
public ValueViewModel<String> FirstName { ... }
}
Используя этот шаблон, вашей модели не нужно реализовывать интерфейс INotifyPropertyChanged, который снова отделяет ваш уровень представления от уровня данных.
MVVM - очень высокомерный шаблон, и вы часто будете видеть вещи, которые на первый взгляд кажутся немного формальными, но следование шаблону дает вам большую гибкость. Если вы решите нарушить правила MVVM, вы поставите на карту всю архитектуру приложения, потому что это нарушение нарушает гибкость, полученную с помощью mvvm. Таким образом, если вы планируете нарушать MVVM, подумайте о том, чтобы вообще не использовать его.