我创建一个的 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;
}

其他提示

威尔 -

这可能是新的规则被标记,直到它们已经被验证。你有没有看到,如果你能直接添加后立即确认他们?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top