0

レプリケーター アクティビティ内に invokeworkflow アクティビティがあります。呼び出しようとしているワークフローには、整数パラメーターと文字列パラメーターの 2 つのパラメーターを渡す必要があり、これらはレプリケーター アクティビティによってワークフローに渡される必要があります。これをどのように行うことができるかについてのアイデアはありますか?

ありがとう。

4

3 に答える 3

2

完全な例を次に示します (コンストラクターに含まれるものはすべて、デザイナーのプロパティ ペインで設定できることに注意してください): Workflow3 は、CodeActivity のみを含むターゲット ワークフローであり、背後にあるコードは次のとおりです。

public sealed partial class Workflow3 : SequentialWorkflowActivity
{
    public static readonly DependencyProperty MyIntProperty =
        DependencyProperty.Register("MyInt", typeof(int), typeof(Workflow3));
    public static readonly DependencyProperty MyStringProperty =
        DependencyProperty.Register("MyString", typeof(string), typeof(Workflow3));

    public Workflow3()
    {
        InitializeComponent();

        this.codeActivity1.ExecuteCode += new System.EventHandler(this.codeActivity1_ExecuteCode);
    }

    public int MyInt
    {
        get { return (int)GetValue(MyIntProperty); }
        set { SetValue(MyIntProperty, value); }
    }

    public string MyString
    {
        get { return (string)GetValue(MyStringProperty); }
        set { SetValue(MyStringProperty, value); }
    }

    private void codeActivity1_ExecuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("Invoke WF: Int = {0}, String = {1}", this.MyInt, this.MyString);
    }
}

Workflow2 は、ReplicatorActivity のみを含むホスティング ワークフローです。ReplicatorActivity には、TargetWorkflow が Workflow3 に設定された InvokeWorkflowActivity のみが含まれます。コード ビハインドは次のとおりです。

public sealed partial class Workflow2 : SequentialWorkflowActivity
{
    // Variables used in bindings
    public int InvokeWorkflowActivity1_MyInt = default(int);
    public string InvokeWorkflowActivity1_MyString = string.Empty;

    public Workflow2()
    {
        InitializeComponent();

        // Bind MyInt parameter of target workflow to my InvokeWorkflowActivity1_MyInt
        WorkflowParameterBinding wpb1 = new WorkflowParameterBinding("MyInt");
        wpb1.SetBinding(WorkflowParameterBinding.ValueProperty, new ActivityBind(this.GetType().Name, "InvokeWorkflowActivity1_MyInt"));
        this.invokeWorkflowActivity1.ParameterBindings.Add(wpb1);

        // Bind MyString parameter of target workflow to my InvokeWorkflowActivity1_MyString
        WorkflowParameterBinding wpb2 = new WorkflowParameterBinding("MyString");
        wpb2.SetBinding(WorkflowParameterBinding.ValueProperty, new ActivityBind(this.GetType().Name, "InvokeWorkflowActivity1_MyString"));
        this.invokeWorkflowActivity1.ParameterBindings.Add(wpb2);

        // Add event handler for Replicator's Initialized event
        this.replicatorActivity1.Initialized += new EventHandler(ReplicatorInitialized);

        // Add event handler for Replicator's ChildInitialized event
        this.replicatorActivity1.ChildInitialized += new EventHandler<ReplicatorChildEventArgs>(this.ChildInitialized);
    }

    private void ReplicatorInitialized(object sender, EventArgs e)
    {
        // Find how many workflows I want
        List<MyClass> list = new List<MyClass>();
        list.Add(new MyClass() { MyInt = 1, MyString = "Str1" });
        list.Add(new MyClass() { MyInt = 2, MyString = "Str2" });
        list.Add(new MyClass() { MyInt = 3, MyString = "Str3" });

        // Assign list to replicator
        replicatorActivity1.InitialChildData = list;
    }

    private void ChildInitialized(object sender, ReplicatorChildEventArgs e)
    {
        // This is the activity that is initialized
        InvokeWorkflowActivity currentActivity = (InvokeWorkflowActivity)e.Activity;

        // This is the initial data
        MyClass initialData = (MyClass)e.InstanceData;

        // Setting the initial data to the activity
        InvokeWorkflowActivity1_MyInt = initialData.MyInt;
        InvokeWorkflowActivity1_MyString = initialData.MyString;
    }

    public class MyClass
    {
        public int MyInt { get; set; }
        public string MyString { get; set; }
    }
}

期待される結果は次のとおりです。

Invoke WF: Int = 1, String = Str1
Invoke WF: Int = 2, String = Str2
Invoke WF: Int = 3, String = Str3

これがあなたを助けることを願っています。

于 2008-11-13T18:32:00.157 に答える
1

この投稿が古いことは承知していますが、同じ質問で Google でこれを見つけた人は、次のことを行う必要があります。

  1. カスタム アクティビティで InvokeWorkflow への呼び出しをラップします。これにより、パラメーターのマッピングが簡素化されます。このアクティビティで、呼び出されたワークフローに渡すプロパティごとに DependencyProperty を作成します。今のところ、これを「InvokerActivity」と呼びましょう。次に、InvokeWorkflowActivity で、Panos が上記で提案したように、TargetWorkflow のプロパティを InvokerActivity の依存関係プロパティにマップします。注: 省略記号を表示するには、オブジェクトが具象型でなければなりません。オブジェクトがインターフェイスの場合、マップできません。ワークフローは、インターフェイス オブジェクトをインスタンス化する方法を知りません。
  2. デザイナーを使用して、InvokerActivity を ReplicatorActivity 内に配置します。
  3. ReplicatorActivity は、ChildInitialized というイベント ハンドラーを公開します。このイベントのハンドラーを作成すると、ReplicatorChildEventArgs を受け取ります。その中で、次のようにイベント引数を介してアクティビティを受け取ることができます。

        InvokerActivity activity = (e.Activity as InvokerActivity);
        if (activity != null)
        {
            activity.MyParam = e.InstanceData as MyParamType;
        }
    

これを実行すると、ReplicatorActivity はコレクション内のすべてのアイテムに対してこのメ​​ソッドを 1 回呼び出し、生成する InvokerActivity ごとにパラメーターを渡します。

e.InstanceData は、Replicator が繰り返し処理するコレクション内の次のオブジェクトになります。

于 2011-02-02T20:19:46.900 に答える
0

次のように、ターゲット ワークフローで 2 つのプロパティを宣言できます。

    public static readonly DependencyProperty MyIntProperty =
        DependencyProperty.Register("MyInt", typeof(int), typeof(Workflow3));
    public static readonly DependencyProperty MyStringProperty =
        DependencyProperty.Register("MyString", typeof(string), typeof(Workflow3));

    public int MyInt
    {
        get { return (int)GetValue(MyIntProperty); }
        set { SetValue(MyIntProperty, value); }
    }

    public string MyString
    {
        get { return (string)GetValue(MyStringProperty); }
        set { SetValue(MyStringProperty, value); }
    }

その後、 の [プロパティ] タブを確認するInvokeWorkflowActivityと、カテゴリに 2 つのプロパティが表示されParametersます。

定数値を指定するか、ホスティング ワークフローの任意のプロパティにバインドできます。

于 2008-11-13T14:36:59.850 に答える