Это достаточно просто, если вы будете следовать нескольким правилам. Вот пример NativeActivity, у которого есть дочерний элемент:
[Designer(typeof(MyActivityDesigner)), ContentProperty("Child")]
public sealed class MyActivity :
NativeActivity, IActivityTemplateFactory
{
// this "activity delegate" holds our child activity
public ActivityAction Child { get; set; }
// may be necessary to do this
protected override void
CacheMetadata(NativeActivityMetadata metadata)
{
metadata.AddDelegate(Child);
}
protected override void
Execute(NativeActivityContext context)
{
// do some work here, then
context.ScheduleAction(Child);
}
// better to use a template factory than a constructor to do this!
Activity IActivityTemplateFactory
.Create(System.Windows.DependencyObject target)
{
return new MyActivity
{
// HAVE to have this set, or it fails in the designer!
Child = new ActivityAction()
};
}
}
Обратите внимание на несколько вещей: мы используем тип Activity Delegate для хранения нашего ребенка. Во-вторых, мы реализуем IActivityTemplateFactory, чтобы настроить нашу деятельность для дизайнера. Всегда лучше / стабильнее делать это, чем устанавливать вещи в конструкторе. Мы будем связываться со свойством делегата, поэтому мы должны установить экземпляр; в противном случае привязка потерпит неудачу.
Когда мы выполняем все, что вам нужно сделать, это запланировать вашего ребенка в случае необходимости и вернуться. Вы не должны блокировать, конечно.
Затем в конструкторе вы привязываете к Child, как это:
<sap:WorkflowItemPresenter
HintText="Add children here!"
Item="{Binding Path=ModelItem.Child.Handler}" />