Frage

Ich bin für die korrekte Version dieser Klasse für Caliburn.Micro suchen

public class WebServiceResult: iResult where T: new ()

Die obige Unterschrift ist aus dem Kontaktmanager Beispiel im vollen Caliburn Rahmen. Es muss nicht geschnitten und direkt in ein Micro-basierten Projekt einfügen. Es gibt zu viele fehlende Klassen diese direkt zu verwenden. Gedanken? oder jemand wissen, der Ersatz?

War es hilfreich?

Lösung

Veranstaltung, obwohl die zugrunde liegende Infrastruktur ist sehr unterschiedlich in Caliburn Micro (die auf System.Windows.Interactivity basieren), sind die Konzepte so ziemlich das gleiche.

Hier ist die CM-Version:

public class WebServiceResult<T, K> : IResult
    where T : new()
    where K : EventArgs
{

    readonly static Func<bool> ALWAYS_FALSE_GUARD= () => false;
    readonly static Func<bool> ALWAYS_TRUE_GUARD = () => true;

    private readonly Action<K> _callback;
    private readonly Expression<Action<T>> _serviceCall;

    private ActionExecutionContext _currentContext;
    private Func<bool> _originalGuard;




    public WebServiceResult(Expression<Action<T>> serviceCall)
    { 
        _serviceCall = serviceCall;
    }

    public WebServiceResult(Expression<Action<T>> serviceCall, Action<K> callback)
    {
        _serviceCall = serviceCall;
        _callback = callback;
    }

    public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };

    public void Execute(ActionExecutionContext context)
    {
        _currentContext = context;

        //if you would to disable the control that caused the service to be called, you could do this:
        ChangeAvailability(false);

        var lambda = (LambdaExpression)_serviceCall;
        var methodCall = (MethodCallExpression)lambda.Body;
        var eventName = methodCall.Method.Name.Replace("Async", "Completed");
        var eventInfo = typeof(T).GetEvent(eventName);

        var service = new T();

        eventInfo.AddEventHandler(service, new EventHandler<K>(OnEvent));

        _serviceCall.Compile()(service);
    }

    public void OnEvent(object sender, K args)
    {
        //re-enable the control that caused the service to be called:
        ChangeAvailability(true);

        if (_callback != null)
            _callback(args);

        Completed(this, new ResultCompletionEventArgs());
    }



    private void ChangeAvailability(bool isAvailable)
    {
        if (_currentContext == null) return;

        if (!isAvailable) {
            _originalGuard = _currentContext.CanExecute;
            _currentContext.CanExecute = ALWAYS_FALSE_GUARD;
        }
        else if (_currentContext.CanExecute == ALWAYS_FALSE_GUARD) {

            _currentContext.CanExecute = _originalGuard ?? ALWAYS_TRUE_GUARD;
        }


        _currentContext.Message.UpdateAvailability();

    }


}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top