博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty)

Posted on 2008-04-12 00:01  生鱼片  阅读(9181)  评论(7编辑  收藏  举报

[置顶]坚持学习WF文章索引

活动(Activity)

活动是工作流的基本单元,每个工作流都会包含若干活动,并且会按一定的逻辑执行。WF中有两种类型一种是简单活动,另一种是复合活动,WF提供了一组标准活动库,当然你也可以自定义活动。所有的活动都继承自Activity类,下面是WF中最基本的活动的类的层次图:

activityclass

 

下面是WF提供的标准活动,具体是干什么的我就不写了,具体可以查阅MSDN,而且以后也会写到

Flow Execution Events Web Services State
IfElse TransactionScope EventDriven WebServiceInput SetState
While Sequence Listen WebServiceOutput State
CAG Compensate HandleExternalEvent WebServiceFault StateInitialization
Policy SynchronizationScope EventHandlingScope InvokeWebService StateFinalization
Replicator Code Delay    
Throw Parallel      
Suspend InvokeWorkflow     WCF
Terminate CallExternalMethod     ReceiveActivity
FaultHandler CompensatableSequence     SendActivity
 

CompensatableTransaction

Scope

     

 

依赖属性(DependencyObject)

依赖属性是WF中提供的一种特殊类型的属性,有三种类型的依赖属性:实例属性、元属性和附加属性。

元属性:元数据属性的值必须在设计时指定,并且在运行时不可以更改.这样我们就不可以绑定元数据属性,元数据属性是通过指定 Metadata 选项来实现的。

实例属性:可以利用活动数据绑定来设置值,无论在设计时还是运行时.可以为该属性分配 ActivityBind 而不是实际值。

附加属性:我们可以为任何从DependencyObject继承而来的对象附加一个依赖属性.也就是说,我们可以在运行时使用自定义属性来扩展所有的Windows Workflow活动.假如父活动需要为每个子活动追加信息,那么就会使用到附加属性.WF提供的标准活动就有一个典型的例子:ConditionedActivityGroup活动.它可以有条件的执行一个或多个子活动,因为它将When条件追加到了每一个子活动之上.在工作流设计器中,CAG的每个子活动都显示有自己的When属性。

据说在WPF里也有依赖属性这东西,不过在System.Windows命名空间下,而WF中在 System.Workflow.ComponenModuel中,概念是一样的,但是不能互通。

只有继承System.Workflow.ComponentModel.DependencyObject的类才能应用定义DependencyProperty,要定义DependencyProperty,要使用System.Workflow.ComponentModel.DependencyProperty的静态方式注册属性,下面就来定义一个依赖属性。

public static DependencyProperty NameToPrintProperty = DependencyProperty.Register("NameToPrint"typeof(System.String), typeof(CustomActivity)); 

        [DescriptionAttribute(
"String to be passed to the custom activity")] 
        [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)] 
        [BrowsableAttribute(
true)] 
        
public string NameToPrint 
        { 
            
get 
            { 
                
return ((String)(base.GetValue(CustomActivity.NameToPrintProperty))); 
            } 
            
set 
            { 
                
base.SetValue(CustomActivity.NameToPrintProperty, value); 
            } 
        }


注意:

静态的从属属性与注册的从属属性名的格式必须是: [名Property] 与 [名] 的格式,如:

Eg1Property = DependencyProperty.Register("Eg1",
Eg1Property 
= DependencyProperty.Register("Eg2"


这个依赖属性可以绑定到工作流的属性中,当然活动属性也可以绑定到其他活动属性。被绑定的属性可以是依赖属性,也可以是.Net里正常属性。如下图所示:

2

 

你要觉得这个代码很复杂,很多的话你可以使用代码段来实现,如下图:

1

 

DependencyProperty事件
1.DependencyProperty事件本质上与DependencyProperty从属属性一样
2.AddHandler、RemoveHandler 通过从属属性添加、移除事件定阅
3.定义一个有DependencyProperty事件   
       

 public static DependencyProperty BeCareEvent = DependencyProperty.Register("BeCare"typeof(EventHandler), typeof(Activity1)); 

        
//定义事件 
        public event EventHandler EA 
        { 
            add 
            { 
                
base.AddHandler(Activity1.BeCare, value); 
            } 
            remove 
            { 
                
base.RemoveHandler(Activity1.BeCare, value); 
            } 
        } 
    } 


4.关于DependencyProperty属性和DependencyProperty事件的可运行代码,我会在下一次的自定义活动中来体现。

上一篇:坚持学习WF(3):WF框架概览
下一篇:坚持学习WF(5):自定义活动(CustomActivity)