문제

나는 만들고있다 ActivityToolBoxItem WF의 사용자 정의 활동. 나는 CreateComponentscore 방법 내의 디자이너들을 위해 가능한 많은 일을하려고 노력하고 있습니다. 내가 끝내려고하는 것은 다음과 같습니다.

1) 내 맞춤 활동 (트리거 활동, ㅏ 시퀀스 반응성), 다음을 포함하는 :
2) a Triggerevaluatoractivity (간단한 활동), 이것은 트리거율의 속성에 묶여 있습니다.
3) an ifelseactivity, 두 개의 가지가 있습니다
4) an ifelsebranchactivity 그것은 포함되어 있습니다
5) a 말기 반응성, 그리고
6) an ifelsebranchactivity TriggereValuatoractivity가 True로 평가할 때 실행이 흐르는 경우는 비어 있습니다.

디자이너는 Triggerevaluatoractivity 실행 컨텍스트에 대한 복잡한 평가를 수행하는 하나 이상의 구현을 통해.

코드로 이것을 설정하는 것은 매우 간단하지만, 나는 회전하는 방법에 완전히 붙어 있습니다. ActivityCondition 그것은 다음에 추가 될 것입니다 ifelsebranchactivity 실행 흐름을 제어합니다.

내가해야 할 일은 Triggerevaluatoractivity. 코드 돔을 통해 멋진 사랑스러운 규칙을 만들었지 만 직접 설정할 수는 없습니다. ifelsebranchactivity, 나는 규칙을 어딘가에 숨기고 활동에 참조해야합니다.

따라서 내 질문은 코드로 규칙을 작성한 후에는 CODECTOOLTOPLOBOITEM 내에서 워크 플로에 규칙을 추가하여 코드로 작성된 활동이 참조 할 수있는 방법은 무엇입니까?

도움이 되었습니까?

해결책

에 따르면 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