Das ViewModel bildet die Logik hinter der View (Benutzerinterface). Folgend findest du ein kleines Beispiel, wie du ein ViewModel aufbauen kannst, so dass es dem MVVM-Designmuster entspricht.
ViewModelBase
Es empfiehlt sich, eine Basis-Klasse für deine ViewModel’s zu erstellen. So kann jedes weitere ViewModel von dieser Klasse erben. Die Basis-Klasse kann wie folgt aussehen und nach belieben erweitert oder angepasst werden.
public abstract class ViewModelBase : INotifyPropertyChanged
{
#region OnPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected bool SetValue<T>(ref T backingField, T value, [CallerMemberName] string propertyName = "")
{
if (object.Equals(backingField, value))
{
return false;
}
backingField = value;
this.OnPropertyChanged(propertyName);
return true;
}
#endregion
#region GlobalProperties
bool _isLoading = false;
public bool IsLoading
{
get => _isLicenseValid;
set => SetValue(ref _isLoading, value);
}
#endregion
}Das spätere ViewModel kann dann die Eigenschaften und Funktionen erben und auf diese zugreifen.
public class AboutViewModel : ViewModelBase
{
#region Properties
bool _updateAvailable;
public bool UpdateAvailable
{
get => _updateAvailable;
set
{
if (value == _updateAvailable)
return;
_updateAvailable = value;
OnPropertyChanged();
}
}
#endregion
#region Constructor
public AboutViewModel()
{
LoadSettings();
}
void LoadSettings()
{
UpdateAvailable = false;
}
#endregion
#region Commands & Actions
public ICommand CheckForUpdatesCommand
{
get { return new RelayCommand(async(p) => await CheckForUpdatesAction()); }
}
async Task CheckForUpdatesAction()
{
await CheckForUpdates();
}
#endregion
#region Methods
async Task CheckForUpdates()
{
// Perform some tasks...
}
#endregion
}