Передать значение OutArgument одного действия в InArgument другого действия? - PullRequest
0 голосов
/ 10 ноября 2011

Есть ли способ передать значение OutArgument одного действия в InArgument другого действия?Или локальная переменная может быть создана автоматически в корневом контейнере действий на основе OutArguments перетаскиваемых действий в течение design времени, которое может использоваться для автоматического резервного копирования значения OutArgument с использованием расширения?

Iзнать, что это выглядит невозможно в WF4 стандартным способом.Но есть ли какой-то дикий способ сделать это?Или смоделируйте путь как WF3?

Пожалуйста, напишите любую свою мысль.

Спасибо

Ядонг

1 Ответ

4 голосов
/ 10 ноября 2011

Если вам нужен уже заполненный рабочий процесс во время разработки со всеми вашими переменными и действиями, возможно, вы можете что-то потренировать с помощью IActivityTemplateFactory .

public class TwoActivitiesBundle : IActivityTemplateFactory
{
    public Activity Create(DependencyObject target)
    {
        return new Sequence
        {
            Variables =
            {
                new Variable<int>("addResult"),
            },

            Activities =
            {
                new Add<int, int, int>
                {
                    Left = 10,
                    Right = 10,
                    Result = new VisualBasicReference<int>("addResult")
                },

                new WriteLine { Text = "Now I'll use 'addResult', as a value on the next activity" },

                new Subtract<int, int, int>
                {
                    Left = new VisualBasicValue<int>("addResult"),
                    Right = 10,
                },

                new WriteLine { Text = new VisualBasicValue<string>("\"Print addResultValue: \" & addResult")}
            }
        };
    }
}

Короче говоря, IActivityTemplateFactory позволяет отбрасывать уже созданные и заполненные действия в конструктор. Затем вы добавляете свою фабрику, в данном случае TwoActivitiesBundle , в панель инструментов дизайнера, как и любое другое действие:

new ToolboxItemWrapper(typeof(TwoActivitiesBundle), null, "My Bundle");

<ч /> Дополнительно:

Если вы действительно хотите добавить переменные в родительский контейнер, вы можете использовать параметр target, полученный в методе Create(), чтобы просмотреть рабочий процесс и найти такой контейнер.

Это пример, в котором предполагается, что вы опускаете TwoActivitiesBundle внутри последовательности и добавляете в нее переменную:

public class TwoActivitiesBundle : IActivityTemplateFactory
{
    public Activity Create(DependencyObject target)
    {
        var sequenceModelItem = (target as WorkflowViewElement).ModelItem;

        sequenceModelItem
            .Properties["Variables"]
            .Collection
            .Add(new Variable<string>("myFirstDesignTimeVariable", "var text here"));


        // This activity writes "I've just created a new variable: var text here" to the console

        return new WriteLine
        {
            Text = new VisualBasicValue<string>("\"I've just created a new variable: \" & myFirstDesignTimeVariable");
        }
    }
}

Как вы можете видеть здесь , ModelItem представляет отдельный элемент в модели редактирования . Таким образом, вы можете обойти весь рабочий процесс, используя свойства Root , Parent и Parents . Затем вы можете редактировать все свойства ModelItem так же, как я покажу вам на примере выше. Обратите внимание, что это довольно трудоемко и может потребовать от вас принять несколько предположений.

...