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