0

WFでカスタムアクティビティのActivityToolboxItemを作成しています。CreateComponentsCoreメソッド内でデザイナーのためにできるだけ多くの作業をしようとしています。私が最終的にしようとしているのは次のとおりです。

1)以下を含むカスタムアクティビティ(TriggerActivitySequenceActivity):
2)TriggerActivityのプロパティにバインドされたTriggerEvaluatorActivity(単純なActivity
) 3)2つのブランチを持つIfElseActivity
4)を含むIfElseBranchActivity
5)TerminateActivity、および
6)TriggerEvaluatorActivityがtrueと評価されたときに実行が流れる空のIfElseBranchActivity。

設計者は、実行コンテキストに対して複雑な評価を実行する1つ以上の実装を使用 してTriggerEvaluatorActivityを切り替えます。

これをコードで設定するのは非常に簡単ですが、実行のフローを制御するためにIfElseBranchActivityに追加されるActivityConditionを起動する方法に完全に固執しています。

私がする必要があるのは、TriggerEvaluatorActivityのプロパティを評価することだけです。コードdomを使用して素敵なルールを作成しましたが、IfElseBranchActivityに直接設定することはできません。ルールをどこかに隠して、アクティビティで参照する必要があります。

したがって、私の質問は、コードでルールを作成したら、カスタムActivityToolboxItem内からワークフローにルールを追加して、コードで作成したアクティビティがそれを参照できるようにするにはどうすればよいかということです。

4

2 に答える 2

1

MSDNのこの質問によると、ルートアクティビティの下の依存関係プロパティに格納されています。コード例が正しいかどうかわからない。


動作します。サンプルコードは次のとおりです。

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;
}
于 2009-05-27T10:17:14.520 に答える
0

意思 -

検証が完了するまで、新しいルールにフラグが立てられる場合があります。それらを追加した直後にそれらを直接検証できるかどうかわかりましたか?

于 2010-06-21T22:24:45.580 に答える