Pergunta

Estou criando um ActivityToolboxItem para uma atividade personalizada no WF. Eu estou tentando fazer o trabalho tanto quanto possível para os designers dentro do método CreateComponentsCore. O que eu estou tentando acabar com é o seguinte:

1) Minha atividade personalizado ( TriggerActivity , a SequenceActivity ), contendo o seguinte:
2) A TriggerEvaluatorActivity (a simples Atividade ), que está vinculado a uma propriedade no TriggerActivity
3) Um IfElseActivity , que tem dois ramos
4) Um IfElseBranchActivity que contém
5) A TerminateActivity , e
6) Um IfElseBranchActivity que está vazio, através do qual a execução flui quando os avalia TriggerEvaluatorActivity a verdade.

Designers mudar o TriggerEvaluatorActivity com um ou mais implementações que realizam avaliações complexas contra um contexto de execução.

Sua bastante simples de configurar isso no código, mas estou completamente preso em como girar um ActivityCondition que serão adicionados à IfElseBranchActivity para controlar a fluxo de execução.

Tudo o que precisa fazer é avaliar uma propriedade no TriggerEvaluatorActivity . Eu criei um lindo Regra agradável através do dom código, mas eu não posso definir que diretamente no IfElseBranchActivity , eu tenho que esconder a algum lugar regra e referenciá-lo na atividade.

Então, acho que a minha pergunta é, depois de já ter criado uma regra no código, como faço para adicionar minha regra para o fluxo de trabalho a partir de um ActivityToolboxItem personalizado para que as atividades que constroem no código pode referenciá-lo?

Foi útil?

Solução

De acordo com a esta questão no MSDN , sua armazenado em uma propriedade de dependência no âmbito da actividade de raiz. Não tenho certeza se o exemplo de código está correto ou não ainda.


Works. Aqui está um código de exemplo:

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;
}

Outras dicas

Will -

Pode ser que novas regras são sinalizados até que tenham sido validados. Será que você veja se você poderia diretamente validando-os imediatamente depois de adicioná-los?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top