Ответ 1
INotifyPropertyChanged
ViewModel должен реализовывать интерфейс INotifyPropertyChanged и должен поднимать его всякий раз, когда propertychanges
public class MyViewModel : INotifyPropertyChanged
{
private string _firstName;
public event PropertyChangedEventHandler PropertyChanged;
public string FirstName
{
get { return _firstName; }
set
{
if (_firstName == value)
return;
_firstName = value;
PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
}
}
}
}
Проблема связана с интерфейсом ICommand, поскольку большая часть кода дублируется также, так как она передает строку, она становится подверженной ошибкам.
В то время как Bindablebase является абстрактным классом, который реализует интерфейс INotifyPropertyChanged и предоставляет SetProperty<T>
. Вы можете уменьшить метод set только до одной строки, а параметр ref позволяет обновить его значение. Код BindableBase ниже представлен INotifyPropertyChanged, путь .NET 4.5 - Revisited
public class MyViewModel : BindableBase
{
private string _firstName;
private string _lastName;
public string FirstName
{
get { return _firstName; }
set { SetProperty(ref _firstName, value); }
}
}
//Inside Bindable Base
public abstract class BindableBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null)
{
if (Equals(storage, value))
{
return false;
}
storage = value;
this.OnPropertyChanged(propertyName);
return true;
}
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler eventHandler = this.PropertyChanged;
if (eventHandler != null)
{
eventHandler(this, new PropertyChangedEventArgs(propertyName));
}
}
}