2009-12-01 13 views
6

No tengo claro cuándo y cómo debería hacer la validación en mis actividades personalizadas/fábricas de actividades personalizadas/diseñadores personalizados en WF 4.0.¿Cuál es el patrón para la validación en tiempo de diseño en Workflow Foundation 4.0?

El único lugar dentro de mi actividad que parece proporcionar soporte de errores de validación se encuentra dentro del método CacheMetadata (creo que esto se llama varias veces durante el proceso de diseño). ¿Es aquí donde debería hacer mi validación? ¿Hay soporte para la validación dentro del ActivityDesigner?

+0

Como nota para los espectadores, no siempre funciona bien con WPF. Finalmente creé un sistema híbrido en el que mi clase base (que extendía NativeActivity) recopilaba errores de validación de las implementaciones y los utilizaba tanto para las llamadas de CacheMetadata como para IDataErrorInfo. – Will

Respuesta

3

Sí, CacheMetadatos en su actividad es donde debe hacer su validación. La validación es un concepto que se aplica tanto al tiempo de ejecución del flujo de trabajo como al diseñador. (Esto se puede ver en el hecho de que todavía se puede intentar ejecutar flujos de trabajo, compilados o declarativas, que tienen errores de validación, pero una excepción será lanzada cuando lo hace.)

Ejemplo:

protected override void CacheMetadata(ActivityMetadata metadata) 
{ 
    if (this.Body == 0) metadata.AddValidationError(
    new ValidationError(
     "You forgot to supply a body for (this activity)", 
     /*iswarning = */ true, 
     "Body")); 
} 

(Ver ActivityMetadata.AddValidationError)

Su pregunta es secundaria hay soporte para añadir la validación del lado ActivityDesigner? La respuesta es 'no, no realmente' - sería posible para hacer un poco de WPF costumbre y el enlace de datos, que añade un poco de 'validación personalizada' en la parte superior de la ActivityDesigner, tal vez incluso utilizar AttachedPropertiesService para definir su propiedad SatisfiesConstraints en su clase de actividad . Pero es un trabajo extra, y no va a vincularse con la validación del tiempo de ejecución de forma consistente, por lo que es una idea de valor limitado.

-1
public class SalesCommissionValidation : CodeActivity<decimal> 
{ 
    public decimal NetSales { get; set; } 
    public decimal Percentage { get; set; } 

    protected override decimal Execute(CodeActivityContext context) 
    { 
     var commission = NetSales * (Percentage/100); 
     return commission; 
    } 

    protected override void CacheMetadata(CodeActivityMetadata metadata) 
    { 
     base.CacheMetadata(metadata); 

     if (NetSales <= 0) 
      metadata.AddValidationError("Sales cannot be less than 0!"); 
     else if (Percentage <= 0) 
      metadata.AddValidationError("Sales percentgage cannot be less than 0!"); 
     else 
     { 
      if (Percentage > 20) 
       metadata.AddValidationError(string.Format("Sales percentgage {0} cannot be greater than 20%", Percentage)); 
     } 

    } 
} 
+0

Su respuesta debe contener una explicación de su código y una descripción de cómo resuelve el problema. – AbcAeffchen

Cuestiones relacionadas