使用依赖项属性

依赖项属性提供了一个集中的工作流状态存储库。 DependencyObject 实质上是一个哈希表,其中存储了曾经应用于它的任何 DependencyProperty 的当前值。

依赖项属性的实例类型可以绑定到实例数据,在此情况下,实际值要到运行时才能确定。 可以将此类型的依赖项属性的值设置为 ActivityBind,以绑定到在运行时访问的实际值。

ActivityBind 将活动属性绑定到下列任一对象:

  • 其他活动属性

  • 字段

  • 属性

  • 方法

在绑定到活动属性时,如果设置了绑定的活动(目标)是自定义活动,Windows Workflow Foundation 将尝试从目标的父活动开始解析源活动。 如果未找到源活动,Windows Workflow Foundation 将尝试从目标活动本身开始解析名称。 如果目标活动不是自定义活动,Windows Workflow Foundation 将尝试从目标活动本身开始解析源活动。

依赖项属性的元数据类型必须在设计时设置为文本值,因为元数据类型在运行时不可变。

备注

对于基于实例的依赖项属性,将忽略在 ValidationOptionAttribute 中设置的任何值;但是,对于基于元数据的依赖项属性,这些值有效。

备注

如果创建了一个活动属性,且其类型派生自 DependencyObject,则必须将其声明为元数据依赖项属性,否则工作流运行时引擎将在运行期间引发异常。

在创建依赖项属性的名称时,必须选择没有为所继承的任何基类中的依赖项属性或事件使用的唯一名称;否则,运行期间会引发 ArgumentException

DependencyProperty 示例

下面的代码示例演示如何使用 DependencyProperty 实现一个条件。 该示例演示如何添加一个 DependencyProperty,并且将正确的类型传入 Register

Public Shared ExecutionConditionProperty As DependencyProperty = DependencyProperty.Register("ExecuteCondition", GetType(ActivityCondition), GetType(ActivityLibrary2.Activity1))

<DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
    Public Property ExecuteCondition() As ActivityCondition
    Get
        Return CType(MyBase.GetValue(ExecutionConditionProperty), ActivityCondition)
    End Get
    Set(ByVal value As ActivityCondition)
        MyBase.SetValue(ExecutionConditionProperty, value)
    End Set
End Property
public static DependencyProperty ExecutionConditionProperty = DependencyProperty.Register("ExecutionCondition", typeof(System.Workflow.ComponentModel.ActivityCondition), typeof(ActivityLibrary2.Activity1));

[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
[BrowsableAttribute(true)]
public System.Workflow.ComponentModel.ActivityCondition ExecutionCondition
{
    get
    {
        return ((System.Workflow.ComponentModel.ActivityCondition)(base.GetValue(ActivityLibrary2.Activity1.ExecutionConditionProperty)));
    }
    set
    {
        base.SetValue(ActivityLibrary2.Activity1.ExecutionConditionProperty, value);
    }
}

附加属性

某些情况下,需要使用活动来注册可由工作流中的其他活动使用的属性。 此类属性称为“附加属性”,它是一种专用形式的依赖项属性。 可以使用 DependencyProperty 类的 RegisterAttached 方法来注册附加属性。

附加属性是一种由其他类声明的、可以随后应用于 DependencyObject 类的任何子类的依赖项属性。 拥有依赖项属性的类必须提供静态访问器方法来获取和设置任意 DependencyObject 实例上的值。

下面的代码演示如何使用附加属性来使复合活动的子活动能够存储在父活动中定义的属性的唯一值。

Public NotInheritable Class CustomActivity
    Inherits CompositeActivity
    Implements IActivityEventListener(Of ActivityExecutionStatusChangedEventArgs)

    ' Declare attached property provided to the child actvities.
    Public Shared ReadOnly WhenConditionProperty As DependencyProperty = DependencyProperty.RegisterAttached("ExecuteCondition", GetType(ActivityCondition), GetType(CustomActivity), New PropertyMetadata(DependencyPropertyOptions.Metadata))

    ' Constructors
    Public Sub New()
        InitializeComponent()
    End Sub

    Public Sub New(ByVal name As String)
        MyBase.New(name)
        InitializeComponent()
    End Sub

    '**********************************************************************
    ' Get and Set accessors for the attached property WhenConditionProperty.
    '**********************************************************************
    Public Shared Function GetWhenCondition(ByVal dependencyObject As Object) As Object
        If dependencyObject Is Nothing Then
            Throw New ArgumentNullException("dependencyObject")
        End If

        Return CType(dependencyObject, DependencyObject).GetValue(WhenConditionProperty)
    End Function

    Public Shared Sub SetWhenCondition(ByVal dependencyObject As Object, ByVal value As Object)
        If dependencyObject Is Nothing Then
            Throw New ArgumentNullException("dependencyObject")
        End If
        CType(dependencyObject, DependencyObject).SetValue(WhenConditionProperty, value)
    End Sub

    Protected Overrides Function Execute(ByVal executionContext As ActivityExecutionContext) As ActivityExecutionStatus
        ' Execute implementation omitted for clarity.
    End Function

    Public Sub OnEvent(ByVal sender As Object, ByVal e As System.Workflow.ComponentModel.ActivityExecutionStatusChangedEventArgs) Implements System.Workflow.ComponentModel.IActivityEventListener(Of System.Workflow.ComponentModel.ActivityExecutionStatusChangedEventArgs).OnEvent
        ' OnEvent implementation omitted for clarity.
    End Sub

    Private Sub EvaluateChildConditions(ByVal child As Activity, ByVal context As ActivityExecutionContext)
        Dim whenCondition As ActivityCondition = CType(child.GetValue(CustomActivity.WhenConditionProperty), ActivityCondition)
        ' ...
    End Sub
End Class
public sealed class CustomActivity : CompositeActivity, IActivityEventListener<ActivityExecutionStatusChangedEventArgs>
{
    // Declare attached property provided to the child actvities.
    public static readonly DependencyProperty WhenConditionProperty = 
        DependencyProperty.RegisterAttached("WhenCondition", typeof(ActivityCondition), typeof(CustomActivity), new PropertyMetadata(DependencyPropertyOptions.Metadata));

    // Constructors
    public CustomActivity()
    {
    }

    public CustomActivity(string name)
        : base(name)
    {
    }

    //**********************************************************************
    // Get and Set accessors for the attached property WhenConditionProperty.
    //**********************************************************************
    public static object GetWhenCondition(object dependencyObject)
    {
        if (dependencyObject == null)
            throw new ArgumentNullException("dependencyObject");
        return (dependencyObject as DependencyObject).GetValue(WhenConditionProperty);
    }

    public static void SetWhenCondition(object dependencyObject, object value)
    {
        if (dependencyObject == null)
            throw new ArgumentNullException("dependencyObject");
        (dependencyObject as DependencyObject).SetValue(WhenConditionProperty, value);
    }

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
    {
        // Execute implementation omitted for clarity.
    }

    public void OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)
    {
        // OnEvent implementation omitted for clarity.
    }

    private void EvaluateChildConditions(Activity child, ActivityExecutionContext context)
    {
            ActivityCondition whenCondition = (ActivityCondition)child.GetValue(CustomActivity.WhenConditionProperty);
            // ...
    }
}

有关依赖项属性的更多信息,请参见 Windows Workflow Foundation 类库参考中的 System.Workflow.ComponentModel 命名空间的 DependencyPropertyDependencyObject 类。

请参见

参考

DependencyObject
DependencyProperty

概念

使用活动属性
创建自定义活动

Footer image

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。