2009-05-26 5 views
0

私はActivityToolboxItemを作成しています.WFのカスタムアクティビティです。私はCreateComponentsCoreメソッド内のデザイナーのためにできるだけ多くの作業をしようとしています。私は何で終わるしようとしていることは、次のとおりです。コードでWFルールを作成するにはどうすればよいですか?

1)マイカスタムアクティビティ(TriggerActivitySequenceActivity)、以下を含む:
2)TriggerEvaluatorActivity(シンプル活動二つのブランチ
4)が含まIfElseBranchActivityを有するTriggerActivity
3)IfElseActivity、上のプロパティにバインドされ
) 5)TerminateActivity、及び
6)TriggerEvaluatorActivityが真と評価された場合、実行が流れる空であるIfElseBranchActivity、。

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

コードでこれを設定することは非常に簡単。その、私は実行の流れを制御するためにIfElseBranchActivityに追加されますActivityConditionをスピンアップする方法について完全にこだわっています。

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

コードでルールを作成したら、カスタムActivityToolboxItem内からルールをワークフローに追加して、コードで作成したアクティビティを参照できるようにします。

答えて

1

this question on 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; 
} 
+0

うわー、自己、それはかなり素晴らしいです。できます。 – Will

+0

ありがとう、私。しかし、私が追加するこれらのルールは、エディタで表示されるまでルールエンジンによって無効とマークされているので、私は何かが欠けていると感じます。それらを見た後、彼らは有効とマークされます。奇妙な。 – Will

0

ウィル -

それは、彼らが検証されるまで、新しいルールがフラグを立てていることかもしれません。追加した直後に直接検証できるかどうかを確認しましたか?

関連する問題