다음을 통해 공유


종속성 속성 사용

종속성 속성은 워크플로 상태의 중앙 집중화된 리포지토리를 제공합니다. 기본적으로 DependencyObject는 지금까지 적용된 모든 DependencyProperty의 현재 값을 저장하는 해시 테이블입니다.

종속성 속성의 인스턴스 형식은 인스턴스 데이터에 바인딩될 수 있습니다. 이 경우 실제 값은 런타임까지 결정되지 않습니다. 이 종속성 속성 형식의 값을 ActivityBind로 설정하여 런타임에 액세스된 실제 값에 바인딩할 수 있습니다.

ActivityBind는 활동 속성을 다음 중 하나에 바인딩합니다.

  • 다른 활동 속성

  • 필드

  • 속성

  • 메서드

Windows Workflow Foundation에서는 활성 속성에 바인딩할 때 바인딩이 설정된 활동(대상)이 사용자 지정 활동이면 대상의 부모 활동에서 시작하는 소스 활동을 확인하려고 하고, 소스 활동이 없으면 대상 활동 자체에서 시작하는 이름을 확인하려고 하며, 대상 활동이 사용자 지정 활동이 아니면 대상 활동 자체에서 시작하는 소스 활동을 확인하려고 합니다.

종속성 속성의 메타데이터 형식은 런타임에 변경할 수 없으므로 디자인 타임에 리터럴 값으로 설정해야 합니다.

참고

ValidationOptionAttribute에서 설정된 모든 값은 인스턴스 기반 종속성 속성의 경우 무시되지만 메타데이터 기반 종속성 속성의 경우에는 유효합니다.

참고

DependencyObject에서 파생된 형식의 활동 속성을 만드는 경우 해당 속성을 메타데이터 종속성 속성으로 선언해야 합니다. 이렇게 하지 않으면 런타임에 워크플로 런타임 엔진에서 예외가 throw됩니다.

종속성 속성에 대한 이름을 만드는 경우 상속하는 기본 클래스에서 종속성 속성이나 이벤트에 사용하지 않는 고유 이름을 선택해야 합니다. 이렇게 하지 않으면 ArgumentException이 런타임에 throw됩니다.

DependencyProperty 예제

다음 코드 예제에서는 DependencyProperty를 사용하여 조건을 구현하는 방법을 보여 줍니다. 이 예제에서는 Register에서 전달된 올바른 형식과 함께 DependencyProperty를 추가하는 방법을 보여 줍니다.

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 Class Library 참조에 있는 System.Workflow.ComponentModel 네임스페이스의 DependencyPropertyDependencyObject 클래스를 참조하십시오.

참고 항목

참조

DependencyObject
DependencyProperty

개념

활동 속성 사용
사용자 지정 활동 만들기

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.