在使用WF进行工作流设计时,假如某些属性没有设置或设置错误,那么WF将会给出相应的提示,在进行自定义活动时同样可以实现对属性值进行验证的功能。用户首先要建议一个专门用于对属性值进行验证的类,例子中命名“CustomActivityValidator”,然后令其继承“System.Workflow.ComponentModel.Compiler.ActivityValidator”父类,并重载“ValidationErrorCollection”方法。
在该方法中用户可以对所需要验证的属性值进行逐一判断,如果验证失败,则可以通过“ValidationError”将错误的信息进行收集,最后一起返回给用户。
例如对字符串属性“Para
if(String.IsNullOrEmpty(activity.Para1))
{
validationErrors.Add(ValidationError.GetNotSetValidationError(Para1Property.Name));
}
例如对字符串是否包含”!”符号进行判断
if(!activity.Para1.Contains(“!”))
{
validationErrors.Add(new ValidationError(“没有包含感叹号”,1,false,Para1Property.Name);
}
用于属性验证的类开发完毕后,就可以在自定义活动的类名上对它进行引用,以实现对属性值的验证功能。
[ActivityValidator(typeof(CustomActivityValidator))]
public partial class Validator:System.Workflow.ComponentMode.Activity
{}
创建自定义活动
创建一个自定义活动,并定义两个字符类型的属性“Para
public static DependencyProperty Para1Property=DependencyProperty.Register(“Para
[DescriptionAttribute(“输入一个字符串”)]
[BrowsableAttribute(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible]
public string Para1
{
get
{
return ((String)(base.GetValue(Activity1.Para1Property)));
}
set
{
base.setValue(Activity1.Para1Property,value);
}
}
public static DependencyProperty Para2Property = DependencyProperty.Register("Para2", typeof(String), typeof(Activity1), new PropertyMetadata("恭喜发财!"));
[DescriptionAttribute("输入一个字符串")]
[BrowsableAttribute(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public string Para2
{
get
{
return ((String)(base.GetValue(Activity1.Para2Property)));
}
set
{
base.SetValue(Activity1.Para2Property, value);
}
}
然后创建一个用于验证的类,命名为”CustomActivityValidator”,在该类中验证属性“para1”和“para2”必须不能为空,而且属性“para1”必须包含感叹号,属性“para2”必须包含“恭喜”两字,代码如下。
public class CustomActivityValidator:System.Workflow.ComponentModel.Compiler.ActivityValidator
{
public override System.Workflow.ComponentModel.Compiler.ValidationErrorCollection ValidateProperties(System.Workflow.ComponentModel.Compiler.ValidationManager manager, object obj)
{
ValidationErrorCollection validationErros = base.ValidateProperties(manager, obj);
Activity1 activity = obj as Activity1;
if (activity != null)
{
if (string.IsNullOrEmpty(activity.Para1))
{
validationErros.Add(ValidationError.GetNotSetValidationError(Activity1.Para1Property.Name));
}
else if (!activity.Para1.Contains("!"))
{
validationErros.Add(new ValidationError("没有包含感叹号", 1, false, Activity1.Para1Property.Name));
}
if (string.IsNullOrEmpty(activity.Para2))
{
validationErros.Add(ValidationError.GetNotSetValidationError(Activity1.Para2Property.Name));
}
else if (!activity.Para2.Contains("恭喜"))
{
validationErros.Add(new ValidationError("没有包含感叹号", 1, false, Activity1.Para2Property.Name));
}
}
return validationErros;
}
}
代码写完后,在Activity1的代码上加上[ActivityValidator(typeof(CustomActivityValidator))]特性才能进行验证。
自定义活动编译通过后将它添加到工作流的设计界面,在属性窗口中将属性“Para1”和“Para2”的默认值去掉,如图1所示,系统给出不能为空的错误提示。
图1 自定义活动验证结果
在属性窗口中将属性“Para1”和“Para2”的默认值分别进行修改,系统也将会给出相应的错误提示。
图2 自定义活动验证结果