Вот аналогичное решение для Marc, которое было расширено для разрешения нескольких свойств onpropertychanges и нескольких RaiseCanExecuteChanged
простейший пример использования
string _firstName;
public string FirstName
{
get { return _firstName; }
set { OnPropertyChanged(ref _firstName, value, "FirstName"); }
}
расширенный пример с использованием нескольких обновлений свойств и нескольких команд
string _firstName;
public string FirstName
{
get { return _firstName; }
set { OnPropertyChanged(ref _firstName, value, "FirstName", "FullName", Command1, Command2); }
}
Расширенный пример вызывает OnProperty, измененный для имени и полного имени, а также вызывает RaiseCanExecuteChanged для command1 и command2
базовый код ViewModel
protected void OnPropertyChanged<T>(ref T field, T value, params object[] updateThese)
{
if (!EqualityComparer<T>.Default.Equals(field, value))
{
field = value;
OnPropertyChanged(updateThese);
}
}
protected void OnPropertyChanged(params object[] updateThese)
{
if (PropertyChanged != null)
{
foreach (string property in updateThese.Where(property => property is string))
PropertyChanged(this, new PropertyChangedEventArgs(property));
foreach (DelegateCommand<object> command in updateThese.Where(property => property is DelegateCommand<object>))
command.RaiseCanExecuteChanged();
}
}