【问题标题】:WF4: How does a NativeActivity remember its children?WF4:NativeActivity 如何记住它的孩子?
【发布时间】:2016-05-19 13:24:49
【问题描述】:

所以,我在这里有点茫然。我正在 Visual Studio 2012 中创建 WCF 工作流服务。如果我有一个带有暴露子活动的 NativeActivity,我使用设计器填写了这些活动。下次我应该如何记住这些孩子是什么打开服务的 XAML 文件?

我创建了一个 NativeActivity,其中有一个 InvokeAction<String> 类型的孩子(见下文)。我在初始化对象时初始化孩子,这似乎很好。

我为此活动创建了一个自定义设计器,它仅使用WorkflowItemPresenter 来显示子活动(见下文)。

当我在我的 WF 服务中添加一个 NativeActivity1 的实例时,我看到我的自定义设计器预填充了我初始化它的 InvokeAction 的实例。我在InvokeAction 活动中添加了一些孩子(比如WriteLine),它出现了,一切看起来都很好。

我保存并构建,它成功了。我关闭并重新打开 WF 服务设计器,然后...WriteLine 消失了。我检查了为 WF 服务保存的 XAML,WriteLine 活动从未进入 XAML。

我的第一个想法是这总是会发生,因为设计者调用了 NativeActivity 的构造函数,它将它的子元素初始化为无子元素 InvokeAction<String>

我不明白我应该如何设置它,所以在重新打开设计器时应该保留这种信息。

我在这里做错了什么?

NativeActivity1:

public sealed class NativeActivity1 : NativeActivity
{

    public InvokeAction<String> child = new InvokeAction<string>()
    {
        Argument = new InArgument<string>(CSharpValue<String>.FromValue("string literal")),
    };
    public InvokeAction<String> Child { get { return child; } }

    protected override void Execute(NativeActivityContext context)
    {
        context.ScheduleActivity(Child);
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        metadata.AddChild(Child);
    }
}

NativeActivity1Designer

<sap:ActivityDesigner x:Class="ActivityLibrary.VisualStudio.Design.NativeActivity1Designer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation">
<Grid>
    <sap:WorkflowItemPresenter Item="{Binding Path=ModelItem.Child, Mode=OneWay}"
                               Margin="5"
                               HintText="Drop Activity Here"/>
</Grid>

【问题讨论】:

    标签: c# .net workflow-foundation-4


    【解决方案1】:

    我似乎偶然发现了答案。

    显然它只会尝试记住具有公共 getter setter 的孩子。因此,即使我不希望任何人更改与孩子关联的 InvokeAction&lt;String&gt; 的实例,它也必须是可设置的,否则 WF4 不会尝试记住它是什么。

    【讨论】:

      【解决方案2】:

      您可以在CacheMetadata 覆盖方法中添加需要您的子操作:

      protected override void CacheMetadata(NativeActivityMetadata metadata)
      {
          if (this.TargetAction == null)
              metadata.AddValidationError("Target action is required.");
      }
      

      这样,设计器将显示一个视觉效果,指示您的活动中缺少数据。这应该使它更正式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-29
        • 2020-02-20
        • 1970-01-01
        • 2021-09-07
        • 1970-01-01
        • 2014-08-15
        • 2018-04-28
        相关资源
        最近更新 更多