在WF4活动设计器上显示动态参数

时间:2012-06-21 01:23:08

标签: workflow-foundation-4 workflow-activity workflow-rehosting

我创建了一个自定义活动,其中包含在设计时创建的Arguments,我遇到了将它们与设计器中的ExpressionTextBox相关联的问题。

ExpressionTextBox在设计器中显示,它们反映了它所绑定的Argument的值,但是在ExpressionTextBox中输入表达式不会被路由回参数。示例/代码是有序的。

它不会让我发布图片,所以链接必须要做。 Designer Example

在上图中,我在第二个ETB中输入了'param2',然后点击了'Edit Arguments'按钮。 (“编辑参数”按钮显示DynamicArgumentDialog)。如果我输入DyanmicArgumentDialog中的值,但是当我单击OK时,它会显示在设计器上。

这是我的设计师的xaml(我可能错过了一些东西)

<ItemsControl Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" ItemsSource="{Binding ModelItem.Arguments}">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="70" SharedSizeGroup="nameColumn" />
          <ColumnDefinition Width="200" />
        </Grid.ColumnDefinitions>

        <sapv:ExpressionTextBox Grid.Column="1"
                                Expression="{Binding Path=., Mode=TwoWay, Converter={StaticResource expressionConverter}, ConverterParameter=Out}"
                                OwnerActivity="{Binding DataContext.ModelItem, ElementName=layoutRoot}"
                                ExpressionType="s:String"
                                UseLocationExpression="True"
                                MaxLines="1"
                                AcceptsReturn="False" />

      </Grid>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

(layoutRoot是我的设计器的根元素的名称,因此我可以从ItemTemplate内部访问ModelItem) (我的Activity上的Arguments属性定义为Collection,目前列表中有两个项目)

虽然我可以使用DynamicArgumentDialog设置我的参数,但我很乐意让它们在设计师中展示。任何人都可以看到这个有什么问题,也许为什么它不起作用?

如果有人想看一下,我也有一个样本。 DynamicArgumentTest

有没有人有幸使用动态参数使ExpressionTextBox正常工作?

1 个答案:

答案 0 :(得分:0)

在代码中设置绑定

var bind = new Binding();
bind.Mode = BindingMode.TwoWay;
bind.Converter = new ArgumentToExpressionConverter();
bind.ConverterParameter = direction;
bind.Path = new PropertyPath(
String.Format("ModelItem.Arguments[{0}]", argumentName));

//Out arguments require L-Value expression
if (direction == "out")
    expressionTbx.UseLocationExpression = true;

//Set the binding and Add the expression block to the grid
expressionTbx.SetBinding(ExpressionTextBox.ExpressionProperty, bind);

http://blogs.microsoft.co.il/blogs/applisec/archive/2010/06/14/how-to-bind-wf-4-0-arguments-to-expressiontextbox-in-code.aspx