最近在做一个关于费用报销的工作流,业务规则中有一个逻辑需要将工作流的状态进行动态的设定。心想这还不容易,直接在代码里设定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就可以了。
于是开始Coding,先定义两个属性:
public Int32 State_PendingDMApproval
{
get {return (int)SPWorkflowStatus.Max + 1;}
}
public Int32 State_PendingGMApproval
{
get {return (int)SPWorkflowStatus.Max + 2;}
}然后回到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);}
}


浙公网安备 33010602011771号