Good good study, day day up.

The day you are tired with learning is the day you never be a developper.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何在workflow的运行时动态设定workflow action的属性

Posted on 2008-06-16 14:48  Y.C.  阅读(557)  评论(0)    收藏  举报
最近在做一个关于费用报销的工作流,业务规则中有一个逻辑需要将工作流的状态进行动态的设定。心想这还不容易,直接在代码里设定SetState控件的State属性不就可以了吗?
于是开始Coding,先定义两个属性:
public Int32 State_PendingDMApproval
{
    
get {return (int)SPWorkflowStatus.Max + 1;}
}


public Int32 State_PendingGMApproval
{
    
get {return (int)SPWorkflowStatus.Max + 2;}
}
回到Designer,在SetState控件(name为setFinalState)的属性中State的下拉框里选择了State_PendingDMApproval,
然后回到Code,在设定状态的地方加入
if(...) setFinalState.State = State_PendingDMApproval;
else setFinalState.State = State_PendingGMApproval;
编译成功,部署成功,启动工作流成功,到了该设定状态的时候,工作流Error Occured了,查看日志,发现日志里记录了这样一个异常:System.InvalidOperationException: Cannot set value to read only field 'State_PendingDMApproval' referred to in binding.傻眼了,难道SetState控件不能动态设定State属性?
google了一把,原来在workflow中这种要binding属性的workflow action还真的不能这么简单的动态设定属性,而是必须通过一个叫做“DependencyProperty"来完成这个工作。
DependencyProperty应该如何使用呢?其实也不难,看我下面的代码就明白了:
public static DependencyProperty workflowProperty = DependencyProperty.Register("workflowState"typeof(Int32), typeof(MyWorkflow));
public Int32 workflowState
{
    
get {return ((int)(base.GetValue(workflowStateProperty)));}
    
set {base.SetValue(workflowStateProperty, value);}
}
然后在Designer中将setFinalState的属性设定为workflowState就可以了。