myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » (WPF) DelegatedTaskedCommand
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

(WPF) DelegatedTaskedCommand

 
Beiträge zu diesem Thema Autor Datum
 (WPF) DelegatedTaskedCommand LaTino 12.02.2016 14:40

Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.969
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

(WPF) DelegatedTaskedCommand

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Beschreibung:
Ein typisiertes Command, das einen beliebigen übergeben Delegaten im Hintergrund ausführt.
(Ich habe eine Pre-4.0-Klasse, die dasselbe mit dem Backgroundworker machte, durch diese ersetzt und finde das Konzept ganz praktisch. Lässt sich sicher noch entschlacken. Und ja, man kann damit sein MVVM kaputtmachen. MVVM Toolkit ist bekannt, aber unerwünscht.)

C#-Code:
//Abstrakte Basisklasse für Hintergrund-Commands
public abstract class TaskedCommandBase : ICommand
{
    private bool _isExecuting;
    public bool IsExecuting
    {
        get
        {
            return _isExecuting;
        }
        set
        {
            if (value.Equals(_isExecuting)) return;
            _isExecuting = value;
            OnCanExecuteChanged();
        }
    }

    protected void OnCanExecuteChanged()
    {
        var handler = CanExecuteChanged;
        if (handler != null)
            handler(this, EventArgs.Empty);
    }

    public bool CanExecute(object parameter)
    {
        return !IsExecuting;
    }

    public async void Execute(object parameter)
    {
        OnBeforeWork(this, parameter);
        await Task.Run(() =>
        {
            IsExecuting = true;
            OnExecute(this, parameter);
            IsExecuting = false;
        });
        OnAfterWork(this, parameter);
    }

    public abstract void OnBeforeWork(object sender, object parameter);
    public abstract void OnExecute(object sender, object parameter);
    public abstract void OnAfterWork(object sender, object parameter);

    public event EventHandler CanExecuteChanged;
}

C#-Code:
//Implementierung mit Delegaten (Action<>)
public class DelegatedTaskedCommand<T> : TaskedCommandBase
{
    private readonly Action<object, T> _beforeWorkAction;
    private readonly Action<object, T> _afterWorkAction;
    private readonly Action<object, T> _executeAction;

    public DelegatedTaskedCommand(Action<object, T> executeAction, Action<object, T> afterWorkAction = null, Action<object, T> beforeWorkAction = null)
    {
        _beforeWorkAction = beforeWorkAction;
        _afterWorkAction = afterWorkAction;
        _executeAction = executeAction;
    }

    public override void OnBeforeWork(object sender, object parameter)
    {
        ExecuteAction(sender, parameter, _beforeWorkAction);
    }

    public override void OnExecute(object sender, object parameter)
    {
        ExecuteAction(sender, parameter, _executeAction);
    }

    public override void OnAfterWork(object sender, object parameter)
    {
        ExecuteAction(sender, parameter, _afterWorkAction);
    }

    private void ExecuteAction(object sender, object parameter, Action<object, T> action)
    {
        if (!(parameter is T)) return;
        if (action != null) action(sender, (T)parameter);
    }
}

C#-Code:
//Anwendung für einen View mit einem ProgressBar, der an die VM-Eigenschaft "OperationProgress" gebunden ist, mit einem string als Parameter
//ViewModel
public ICommand TestCommand
{
    get
    {
        IProgress<int> progressHandler = new Progress<int>(value => OperationProgress = value);
        return new DelegatedTaskedCommand<string>((sender, param) =>
        {
            var stringBuilder = new StringBuilder(param);
            for (var i = 0; i < 100; i++)
            {
                progressHandler.Report(i+1);
                Thread.Sleep(100);
                stringBuilder.Append(i.ToString());
            }
            _stringMember = stringBuilder.ToString();
        });
    }
}

WPF, ICommand, Task
12.02.2016 14:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Jahre.
Der letzte Beitrag ist älter als 3 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 20.08.2019 22:15