myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Gemeinschaft (https://www.mycsharp.de/wbb2/board.php?boardid=64)
-- .NET-Komponenten und C#-Snippets (https://www.mycsharp.de/wbb2/board.php?boardid=67)
--- (WPF) DelegatedTaskedCommand (https://www.mycsharp.de/wbb2/thread.php?threadid=116555)


Geschrieben von LaTino am 12.02.2016 um 14:40:
  (WPF) DelegatedTaskedCommand
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


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 23.08.2019 09:34