WF:工作流设计器:动态添加的InArgument列表:如何在工作流执行期间获取值

时间:2015-03-16 13:36:18

标签: wpf workflow-foundation-4 workflow-foundation

我已经构建了一个工作流设计器,允许输入电子邮件地址列表。列表中的每个电子邮件都需要是InArgument(Of String),因此可以使用变量单独编辑/添加它们。

在我的Activity上,我有一个声明如下的属性:

Public Property [To] As ObservableCollection(Of InArgument(Of String))

我的设计师已正确连接并正确填充此集合。

但是在执行期间,我不知道如何获取添加的每个InArgument的运行时值。

当我们执行工作流并迭代添加到列表中的每个InArgument时,我试图获得如下所示的值,但是失败了:

For Each toAddress As InArgument(Of String) In Me.To.ToList()
            Dim emailToAddress As String = toAddress.Get(_Context)          
Next

我们得到的错误是“The argument of type '<type>' cannot be used. Make sure that it is declared on an activity”,而在我的情况下,type是一个字符串...

我们得到的错误有意义,因为我们没有在活动上声明属性,因为它是动态添加到列表中的,因此无法使用下面显示的语法获取值:

The_Property_Name.Get(_Context)

有人可以帮忙吗?我似乎无法找到任何东西。我应该采取不同的方法吗?

1 个答案:

答案 0 :(得分:0)

我想通了,所以我会回答我自己的问题!我们需要做的就是通过覆盖活动上的CacheMetadata()方法将集合项显式添加到元数据中。然后,它使其可用于工作流程上下文。

首先我们将它们添加到上下文中:

   Protected Overrides Sub CacheMetadata(ByVal metadata As CodeActivityMetadata)
        MyBase.CacheMetadata(metadata)

        Dim i As Integer = 0
        For Each item As InArgument(Of String) In Me.To
            Dim runTimeArg As RuntimeArgument = New RuntimeArgument("TO" & i.ToString(), item.ArgumentType, item.Direction, False)
            metadata.Bind(item, runTimeArg)
            metadata.AddArgument(runTimeArg)
            i = i + 1
        Next

    End Sub

然后在执行时,我们得到像这样的值

   For Each item As InArgument(Of String) In Me.To
            Dim email As String = _Context.GetValue(item)
        Next