レプリケーター アクティビティ内に invokeworkflow アクティビティがあります。呼び出しようとしているワークフローには、整数パラメーターと文字列パラメーターの 2 つのパラメーターを渡す必要があり、これらはレプリケーター アクティビティによってワークフローに渡される必要があります。これをどのように行うことができるかについてのアイデアはありますか?
ありがとう。
レプリケーター アクティビティ内に invokeworkflow アクティビティがあります。呼び出しようとしているワークフローには、整数パラメーターと文字列パラメーターの 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
これがあなたを助けることを願っています。
この投稿が古いことは承知していますが、同じ質問で Google でこれを見つけた人は、次のことを行う必要があります。
ReplicatorActivity は、ChildInitialized というイベント ハンドラーを公開します。このイベントのハンドラーを作成すると、ReplicatorChildEventArgs を受け取ります。その中で、次のようにイベント引数を介してアクティビティを受け取ることができます。
InvokerActivity activity = (e.Activity as InvokerActivity);
if (activity != null)
{
activity.MyParam = e.InstanceData as MyParamType;
}
これを実行すると、ReplicatorActivity はコレクション内のすべてのアイテムに対してこのメソッドを 1 回呼び出し、生成する InvokerActivity ごとにパラメーターを渡します。
e.InstanceData は、Replicator が繰り返し処理するコレクション内の次のオブジェクトになります。
次のように、ターゲット ワークフローで 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
ます。
定数値を指定するか、ホスティング ワークフローの任意のプロパティにバインドできます。