我怎样才能在代码中创建WF规则?
-
06-09-2019 - |
题
我创建一个的 ActivityToolboxItem 作为在WF自定义活动。我试图在CreateComponentsCore方法中的设计师做到的事情成为可能。我试图用落得如下:
1)我的自定义活动(的 TriggerActivity 下,一个 SequenceActivity ),含有如下:结果 2)的 TriggerEvaluatorActivity 强>(一个简单的活动),它被绑定到一个属性上TriggerActivity结果 3)的 IfElseActivity 下,其具有两个分支,点击 4)的 IfElseBranchActivity 强>包含搜索 5)的 TerminateActivity ,然后,点击 6)一种的 IfElseBranchActivity 强>是空的,通过它当TriggerEvaluatorActivity评估为真执行流。
设计者切换出的 TriggerEvaluatorActivity 强>与针对执行上下文执行复杂的评估一个或多个实现。
它非常简单的代码来设置的,但我完全被卡住如何旋转起来的 ActivityCondition 将被添加到 IfElseBranchActivity 的控制执行的流程。
所有我需要做的是对的 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;
}
其他提示
威尔 -
这可能是新的规则被标记,直到它们已经被验证。你有没有看到,如果你能直接添加后立即确认他们?