Question

Je crée un ActivityToolboxItem pour une activité personnalisée dans WF. Je suis en train de faire autant de travail que possible pour les concepteurs dans la méthode CreateComponentsCore. Ce que je suis en train de finir avec est le suivant:

1) Mon activité personnalisée ( TriggerActivity , SequenceActivity ), contenant les éléments suivants:
2) A TriggerEvaluatorActivity (simple Activité ), qui est lié à une propriété sur le TriggerActivity
3) IfElseActivity , qui a deux branches
4) Une IfElseBranchActivity qui contient
5) A TerminateActivity , et
6) Un IfElseBranchActivity qui est vide, à travers laquelle circule l'exécution lorsque le TriggerEvaluatorActivity évalue à vrai.

Les concepteurs passent le TriggerEvaluatorActivity avec un ou plusieurs implémentations qui effectuent des évaluations complexes contre un contexte d'exécution.

Son assez simple à mettre cela dans le code, mais je suis complètement coincé sur la façon de tourner en place un ActivityCondition qui sera ajouté à la IfElseBranchActivity pour contrôler la flux d'exécution.

Tout ce que je dois faire est d'évaluer un bien sur la TriggerEvaluatorActivity . J'ai créé une belle belle règle via le dom code, mais je ne peux pas définir que directement sur le IfElseBranchActivity , je dois cacher quelque part la règle et la référence dans l'activité.

Alors, je suppose que ma question est, une fois que je l'ai créé une règle dans le code, comment puis-je ajouter ma règle du flux de travail à partir d'un ActivityToolboxItem personnalisé de sorte que les activités que je construis dans le code peuvent y faire référence?

Était-ce utile?

La solution

Selon cette question sur MSDN , son stocké dans une propriété de dépendance sous l'activité racine. Je ne sais pas si l'exemple de code est correct ou pas encore.


Travaux. Voici quelques exemples de code:

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;
}

Autres conseils

est -

Il se peut que de nouvelles règles sont signalées jusqu'à ce qu'ils aient été validés. Vous avez vu si vous pouvez directement les valider immédiatement après les ajouter?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top