Как обнаружить событие копирования / вырезания вставки в повторно размещенном конструкторе WF 4.0? - PullRequest
1 голос
/ 18 января 2012

Я использую повторно размещенный дизайнер WF 4.0.

Когда я перетаскиваю пользовательское действие, которое я создал, унаследовав от класса CodeActivity, я хочу сгенерировать новый GUID и назначить его свойству в моем пользовательском действии.

Чтобы это работало, мне пришлось реализовать интерфейс IActivityTemplateFactory и в его методе Create каждый раз создавать новый GUID.

Это работает, когда пользователь перетаскиваетновое занятие на дизайнера.

Однако, если пользователь скопирует существующее действие и вставит его (для создания нового действия), метод Create этого интерфейса не сработает.

Теперь я получаюс двумя экземплярами этого действия с тем же свойством GUID.

Есть ли способ обойти это?Есть ли другой интерфейс или событие, которое я могу перегрузить / переопределить, чтобы обнаружить операцию копирования / вырезания вставки?

1 Ответ

1 голос
/ 18 января 2012

IActivityTemplateFactory.Create следует вызывать только тогда, когда Деятельность создается , а не когда она перемещается из одного места в другое на поверхности конструктора.

Это сложный вопрос с точки зрения дизайна. Ваши действия должны быть спроектированы таким образом, чтобы они не «знали» об области дизайна и не зависели от событий копирования / вставки в конструкторе.

ActivityDesigner - это другое дело. Это может быть простое исправление, чтобы ActivityDesigner регистрировал наблюдателя со своим свойством ModelItem, а затем, когда это свойство изменяется, он автоматически устанавливает Guid для этого ModelItem. Это довольно сложно, к сожалению. Вы должны быть в состоянии понять, как работают ModelItems и как использовать свойство DependencyProperty.

Вот как добавить часы к DP:

DependencyPropertyDescriptor
    .FromProperty(
        ActivityDesigner.ModelItemProperty, 
        typeof(ActivityDesigner))
    .AddValueChanged(this, OnModelItemChanged);

Несколько замечаний здесь. Во-первых, это должно быть вызвано в конструкторе вашего дизайнера. DependencyPropertyDescriptor.FromProperty возвращает DPD. Если ваш обработчик событий перестанет срабатывать, вам нужно будет сохранить ссылку на этот DPD. Дизайнер рабочего процесса и DPD не играют хорошо; Я подал отчет об ошибке в MS об этом. В-третьих, OnModelItemChanged - это простой обработчик событий (void (object, EventHandler)).

ModelItems оборачивают действия, которые они представляют. Вы ДОЛЖНЫ использовать ModelItem для изменения свойств обернутого действия, даже если вы можете извлечь из него действие. Если вы этого не сделаете, поверхность дизайна будет не синхронизирована с Activity. Итак, вы должны установить свойство Guid следующим образом:

this.ModelItem.Properties["Guid"].SetValue(Guid.NewGuid());
...