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 объясняет это более подробно.