どのように私はコード内のWFルールを作成することができますか?
-
06-09-2019 - |
質問
私はWFでのカスタムアクティビティのためののActivityToolboxItemのを作成しています。私はCreateComponentsCoreメソッド内のデザイナーのためのできるだけ多くの仕事をやろうとしています。私は何で終わるしようとしていることは、次のとおりです。
1)マイカスタムアクティビティ(のSequenceActivity の、のTriggerActivityの)、以下を含む:
TriggerActivity
上のプロパティにバインドされている2)Aの TriggerEvaluatorActivity の(単純な活性)、
3)アンの二つの枝を持っているのIfElseActivity、
4)アンの IfElseBranchActivity の
が含まれています
5)A のTerminateActivityの、および
TriggerEvaluatorActivityが真と評価された場合、実行が流れる6)アンのIfElseBranchActivity のものが空である、
設計者は、実行コンテキストに対して複雑な評価を実行する1つまたは複数の実装でのTriggerEvaluatorActivityのを切り替えます。
のIfElseBranchActivity のに追加されます。のコードでこれを設定するために、その非常に簡単に、私はのActivityConditionのをスピンアップする方法について完全にこだわっているよう制御します実行フローます。
私がやらなければならないことは、のTriggerEvaluatorActivityののプロパティを評価しています。私は、コードのDOMを経由して素敵な素敵なルールを作成しましたが、私は、のIfElseBranchActivity の上で直接これを設定することはできません、私はどこかのルールを隠しておくと活動にそれを参照する必要があります。
だから、私は私がコードで構築活動がそれを参照できるように、どのように私は、カスタムActivityToolboxItem内からのワークフローに自分のルールを追加するコードでルールを作成したら、私の質問は、あると思う?
解決
によると、 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;
}
他のヒント
ウィル -
これは、彼らが検証されるまで、新しいルールがフラグを立てていることかもしれません。あなたが直接、すぐにそれらを追加した後にそれらを検証することができれば、あなたは見ましたか?