Когда я понимаю, что ваш код правильно извлекается, я думаю, что проблема в том, что пользовательский интерфейс не уведомляется, когда введен неверный адрес электронной почты. В ProfileView_PropertyChanged (...) вы проверяете, является ли электронная почта действительной, и если она недействительна, IsEmailValid () должен вернуть false. Тем не менее, ничего не сделано с этим результатом; самое важное: пользовательский интерфейс не уведомляется об изменении свойства IsValid, и поэтому состояние кнопки IsEnabled не обновляется. Конечно, возвращаемое значение свойства IsValid изменится после ввода недействительного eMail, но пользовательский интерфейс не запрашивает это новое значение.
Решение должно заключаться в том, чтобы вызвать событие PropertyChanged для свойства IsValid в методе ProfileView_PropertyChanged (...), например:
void ProfileView_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
IsEmailValid();
OnPropertyChanged("IsValid"); // <== this one is important!
}
Вы также можете заключить вызов OnPropertyChanged (...) в оператор if, в зависимости от результата IsEmailValid (), но это зависит от вас.
На самом деле вам даже не нужен вызов метода IsEmailValid (), потому что он будет вызываться сразу после возникновения события PropertyChanged. Однако я не хотел удалять это, потому что я не знаю, может ли это привести к какой-либо другой ошибке в вашем приложении.