BindableBase против INotifyChanged
кто-нибудь знает, является ли BindableBase все еще жизнеспособным или мы должны придерживаться событий INotifyChanged? Похоже, BindableBase быстро потеряла свой блеск. Спасибо за любую информацию, которую вы можете предоставить.
3 ответов
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));
}
}
}
Это не выбор между этими двумя.
bindablebase реализует INotifyPropertyChanged.
поэтому, если вы используете BindableBase, вы будете использовать INotifyPropertyChanged.
INotifyPropertyChanged является более или менее обязательным при реализации MVVM с использованием привязки данных.
использовать ли BindableBase или другую реализацию зависит от предпочтения и использования Prism.
чтобы развернуть ответ Rohit, если вы используете .NET 4.6, вы можете воспользоваться нулевым условным оператором и упростить метод OnPropertyChanged следующим образом:
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
INotifyPropertyChanged, путь .NET 4.6 объясняет это более подробно.