Frage

Ich erstelle ein ActivityToolboxItem für eine benutzerdefinierte Aktivität in WF. Ich versuche, so viel Arbeit wie möglich für die Designer in der CreateComponentsCore Methode zu tun. Was ich versuche mit, am Ende ist die folgende:

1) Meine benutzerdefinierte Aktivität ( TriggerActivity , ein SequenceActivity ), mit folgendem Inhalt:
2) Ein TriggerEvaluatorActivity (eine einfache Aktivität ), die auf eine Eigenschaft auf dem TriggerActivity
gebunden ist 3) Eine IfElseActivity , die zwei Zweige hat
4) Ein IfElseBranchActivity das enthält
5) Ein TerminateActivity , und
6) Eine IfElseBranchActivity das leer ist, durch welche die Ausführung fließt, wenn die TriggerEvaluatorActivity true ergibt.

Designer Schalter aus der TriggerEvaluatorActivity mit einem oder mehreren Implementierungen, die komplexen Auswertungen gegen einen Ausführungskontext auszuführen.

Es ist ziemlich einfach dies in Code zu gründen, aber ich bin ganz fest, wie ein ActivityCondition spin up, die die hinzugefügt werden IfElseBranchActivity zur Steuerung des Ablauf der Ausführung.

Alles, was ich tun muß, ist eine Eigenschaft auf der Seite bewertet TriggerEvaluatorActivity . Ich habe eine schöne schöne Regel über den Code dom erstellt, aber ich kann das nicht direkt an dem alten IfElseBranchActivity , ich habe die Regel irgendwo beiseite zu schaffen und es in der Tätigkeit verweisen.

Also, ich denke, meine Frage ist, wenn ich eine Regel in Code erstellt haben, wie füge ich meine Regel an den Workflow aus einer benutzerdefinierten ActivityToolboxItem so, dass die Tätigkeiten, die ich in Code bauen kann es verweisen?

War es hilfreich?

Lösung

Nach diese Frage auf MSDN , sein in einer Abhängigkeitseigenschaft unter der root-Aktivität gespeichert. Nicht sicher, ob das Codebeispiel korrekt ist oder noch nicht.


Werke. Hier ist ein Beispielcode:

protected override System.ComponentModel.IComponent[] 
    CreateComponentsCore(System.ComponentModel.Design.IDesignerHost host)
{
    var trigger = new Trigger() { Name = "Trigger" };
    var never = new Never() { Name = "NeverTrigger" };
    var ifelse = new IfElseActivity() { Name = "IfElse" };
    var stop = new TerminateActivity() { Name = "StopJob" };
    var failed = new IfElseBranchActivity() { Name = "NotTriggered" };
    var succeeded = new IfElseBranchActivity() { Name = "Triggered" };
    // build tree
    failed.Activities.Add(stop);
    ifelse.Activities.Add(failed);
    ifelse.Activities.Add(succeeded);
    trigger.Activities.Add(never);
    trigger.Activities.Add(ifelse);
    // create rule if it doesn't already exist
    var ruleDefinitions = GetRuleDefinitions
        (host.RootComponent as DependencyObject);
    if (!ruleDefinitions.Conditions.Contains(RuleName))
    {
        var neverTrigger = 
            new CodePropertyReferenceExpression
                (new CodeThisReferenceExpression(), 
                "NeverTrigger");
        var triggered = 
            new CodePropertyReferenceExpression
                (neverTrigger, 
                "Triggered");
        var falseSide = new CodeBinaryOperatorExpression();
        falseSide.Left = triggered;
        falseSide.Right = new CodePrimitiveExpression(false);
        falseSide.Operator = CodeBinaryOperatorType.ValueEquality;

        var ruleCondition = new RuleExpressionCondition
            (RuleName, falseSide);


        ruleDefinitions.Conditions.Add(ruleCondition);
    }
    // add rule to the failed branch; 
    // don't need a rule for the succeeded branch
    failed.Condition = new RuleConditionReference() 
        { ConditionName = RuleName };

    return new IComponent[] { trigger };
}

private RuleDefinitions GetRuleDefinitions
    (DependencyObject rootComponent)
{
    var ruleDefinitions = rootComponent.GetValue
        (RuleDefinitions.RuleDefinitionsProperty) as RuleDefinitions;
    if (ruleDefinitions == null)
    {
        ruleDefinitions = new RuleDefinitions();
        rootComponent.SetValue(RuleDefinitions.RuleDefinitionsProperty, 
            ruleDefinitions);
    }
    return ruleDefinitions;
}

Andere Tipps

Will -

Es kann sein, dass die neuen Regeln gekennzeichnet sind, bis sie validiert wurden. Hast du gesehen, wenn man sie direkt nach ihnen Zugabe sofort Validierung könnte?

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