Validation 什么';工作流基础4中的设计时间验证模式?

Validation 什么';工作流基础4中的设计时间验证模式?,validation,workflow-foundation-4,designer,Validation,Workflow Foundation 4,Designer,我不清楚何时以及如何在WF 4.0中的自定义活动/自定义活动工厂/自定义设计器中进行验证 在我的活动中,似乎唯一提供验证错误支持的地方是CacheMetadata方法(我相信在设计过程中会多次调用该方法)。我应该在这里进行验证吗?ActivityDesigner中是否支持验证?是的,活动中的CacheMatadata是您应该进行验证的地方。验证是一个适用于工作流运行时和设计器的概念。(您可以从以下事实中看出这一点:您仍然可以尝试运行有验证错误的已编译或声明式工作流,但执行时将引发异常。) 例如:

我不清楚何时以及如何在WF 4.0中的自定义活动/自定义活动工厂/自定义设计器中进行验证


在我的活动中,似乎唯一提供验证错误支持的地方是CacheMetadata方法(我相信在设计过程中会多次调用该方法)。我应该在这里进行验证吗?ActivityDesigner中是否支持验证?

是的,活动中的CacheMatadata是您应该进行验证的地方。验证是一个适用于工作流运行时和设计器的概念。(您可以从以下事实中看出这一点:您仍然可以尝试运行有验证错误的已编译或声明式工作流,但执行时将引发异常。)

例如:

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"));
}
(见附件)

第二个问题是是否支持从ActivityDesigner端添加验证?答案是“不,不是真的”-可以进行一些自定义WPF和数据绑定,在ActivityDesigner的顶部添加一些“自定义验证”,甚至可以使用AttachedProperties服务在activity类上定义自己的SatisfiesConstraints属性。但这是额外的工作,而且它不会与运行时验证保持一致,因此它的价值有限。

公共类SalesCommissionValidation:CodeActivity
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));
        }

    }
}
{ 公共十进制NetSales{get;set;} 公共小数百分比{get;set;} 受保护的重写十进制执行(CodeActivityContext上下文) { var佣金=净销售额*(百分比/100); 退货佣金; } 受保护的覆盖无效缓存元数据(CodeActivityMetadata元数据) { base.CacheMetadata(元数据);
if(NetSales)作为对观众的一个提示,它并不总是与WPF一起很好地工作。我最终创建了一个混合系统,在这个系统中我的基类(扩展NativeActivity)从实现中收集验证错误,并将这些错误用于CacheMatadata调用和IDataErrorInfo。您的答案应包含对代码的解释以及如何解决问题的描述。