Pytanie BindableBase vs INotifyChanged


Czy ktoś wie, czy BindableBase jest nadal opłacalna, czy powinniśmy trzymać się zdarzeń INotifyChanged? Wygląda na to, że BindableBase szybko straciło swój blask. Dziękujemy za wszelkie informacje, które możesz podać.


12
2018-03-04 00:16


pochodzenie


Na początek BindableBase jest rzeczą pryzmatyczną, więc nie ma znaczenia dla wanilowej WPF (choć może to być koncepcja). Mógłbyś być bardziej konkretny w tym, o co pytasz? - BradleyDotNET
używam BindableBase w moich projektach Prism. Jest wciąż lśniąco :) - dub stylee


Odpowiedzi:


INotifyPropertyChanged

ViewModel powinien implementować interfejs INotifyPropertyChanged i powinien go podnosić za każdym razem, gdy jest to odpowiednie

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"));
        }
    }


    }
}

Problem dotyczy ICommand Interfejs, ponieważ większość kodu jest powielana również dlatego, że przekazuje ciąg, staje się podatny na błędy.

Natomiast Bindablebase jest klasą abstrakcyjną, która implementuje interfejs INotifyPropertyChanged i zapewnia SetProperty<T>.Możesz zredukować ustawioną metodę do tylko jednego wiersza, a parametr ref umożliwia aktualizację jego wartości. Poniższy kod BindableBase pochodzi z INotifyPropertyChanged, The .NET 4.5 Way - 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));
      }
    }
}

22
2018-03-04 07:01





To nie jest wybór między tymi dwoma.

BindableBase implementuje INotifyPropertyChanged.

Więc jeśli używasz BindableBase, będziesz używał INotifyPropertyChanged.

Parametr INotifyPropertyChanged jest mniej lub bardziej obowiązkowy podczas wdrażania MVVM przy użyciu DataBinding.

To, czy użyć BindableBase, czy innej implementacji, zależy od preferencji i użycia Prism.


5
2018-03-04 06:56



Więc BindableBase jest wyłącznie dla Prism? Gdybym chciał użyć Prism i standardowej MVVM, powinienem trzymać się podejścia INotifyPropertyChanged. - ChiliYago
@ChiliYago jakakolwiek odpowiedź na to jest czysta opinia; to ty decydujesz. Nie ma standardowej MVVM, jest to zestaw wytycznych, które pomogą Ci przypisać odpowiedzialność do zajęć. Jaka implementacja nie jest we wzorcu. - Erno de Weerd


Aby rozwinąć odpowiedź Rohita, jeśli korzystasz z .NET 4.6, możesz skorzystać z operatora warunkowego Null i uprościć metodę OnPropertyChanged w następujący sposób:

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

INotifyPropertyChanged, .NET 4.6 Way wyjaśnia to bardziej szczegółowo.


2
2018-05-23 17:27