Weiß jemand, ob BindableBase noch praktikabel ist oder sollten wir bei INotifyChanged-Ereignissen bleiben? Es scheint, als ob BindableBase seinen Glanz schnell verloren hat. Vielen Dank für Ihre Informationen.BindableBase vs INotifyChanged
Antwort
INotifyPropertyChanged
Das Ansichtsmodell die INotifyPropertyChanged-Schnittstelle implementieren sollte und es erhöhen, wenn das Property
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 ICommand Schnittstelle ist wie die meisten der Code auch dupliziert wird, da es passiert string es wird fehleranfällig.
Während Bindablebase ist eine abstrakte Klasse, die INotifyPropertyChanged-Schnittstelle implementiert und SetProperty<T>
bieten .Sie können die Set-Methode reduzieren, um nur eine Zeile, die Sie auch ref Parameter ermöglicht es seinen Wert zu aktualisieren. Der BindableBase Code unten kommt von 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));
}
}
}
Es ist keine Wahl zwischen diesen beiden.
BindableBase implementiert INotifyPropertyChanged.
Wenn Sie also BindableBase verwenden, verwenden Sie INotifyPropertyChanged.
INotifyPropertyChanged ist mehr oder weniger obligatorisch, wenn MVVM mit DataBinding implementiert wird.
Ob BindableBase oder eine andere Implementierung verwendet werden soll, hängt von der Vorliebe und Verwendung von Prism ab.
Also BindableBase ist ausschließlich für Prism? Wenn ich Prism und Standard-MVVM verwenden wollte, sollte ich mich einfach an den INotifyPropertyChanged-Ansatz halten. – ChiliYago
@ChiliYago keine Antwort darauf ist reine Meinung; Es liegt an Ihnen zu entscheiden. Es gibt keine Standard-MVVM, sondern nur eine Reihe von Richtlinien, die Ihnen helfen, Verantwortlichkeiten den Klassen zuzuordnen. Welche Implementierung Sie verwenden, ist nicht im Muster. –
auf Rohit Antwort zu erweitern, wenn Sie .NET 4.6 verwenden, können Sie die Vorteile der Null-Konditionaloperator zu nehmen und die OnPropertyChanged Methode auf folgende Weise vereinfachen:
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
INotifyPropertyChanged, The .NET 4.6 Way erklärt es ausführlicher.
Für den Anfang ist BindableBase eine Prism-Sache, ist also nicht relevant für Vanille WPF (obwohl das Konzept sein könnte). Könnten Sie genauer sein in dem, was Sie fragen? – BradleyDotNET
Ich verwende "BindableBase" in meinen Prism-Projekten. Es ist immer noch schön glänzend :) –