Pregunta

Estoy creando un ActivityToolboxItem para una actividad personalizada en WF. Estoy tratando de hacer tanto trabajo como sea posible para los diseñadores dentro del método CreateComponentsCore. Lo que estoy tratando de terminar con es el siguiente:

1) Mi actividad personalizada ( TriggerActivity , un SequenceActivity ), que contiene lo siguiente:
2) Un TriggerEvaluatorActivity (un simple Actividad ), que está unido a una propiedad en la TriggerActivity
3) Un IfElseActivity , que tiene dos ramas
4) Un IfElseBranchActivity que contiene
5) Un TerminateActivity , y
6) Un IfElseBranchActivity que está vacío, a través del cual fluye la ejecución cuando el TriggerEvaluatorActivity evalúa como verdadera.

Los diseñadores interruptor hacia afuera la TriggerEvaluatorActivity con una o más implementaciones que llevan a cabo evaluaciones complejas contra un contexto de ejecución.

Es bastante fácil de configurar esto en el código, pero estoy completamente atascado sobre la manera de girar hasta un ActivityCondition , que se añadirá a la IfElseBranchActivity para controlar la flujo de ejecución.

Todo lo que tiene que hacer es evaluar una propiedad en la TriggerEvaluatorActivity . He creado una buena regla preciosa a través del DOM código, pero no puedo establecer que directamente en el IfElseBranchActivity , tengo que esconder la regla en alguna parte y hacer referencia a ella en la actividad.

Por lo tanto, supongo que mi pregunta es, una vez que haya creado una regla en el código, ¿cómo puedo añadir mi regla para el flujo de trabajo dentro de un ActivityToolboxItem personalizado para que las actividades que construyo en el código puede hacer referencia a ella?

¿Fue útil?

Solución

De acuerdo con esta pregunta en MSDN , la almacena en una propiedad de dependencia bajo la actividad de las raíces. No estoy seguro si el ejemplo de código es correcto o no.


obras. He aquí algunos ejemplos de código:

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

Otros consejos

Will -

Puede ser que las nuevas normas se marcan hasta que hayan sido validados. -¿Viste si se pudiera validar directamente inmediatamente después de la adición de ellos?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top