ViewModelBase-Beispiel

Beispiel für eine einfache VIewModel-Basisklasse unter C#.

Image Description

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
}

Was this article helpful to you?

Yes No

Related Articles