Динамическое реагирование на события - PullRequest
0 голосов
/ 28 марта 2009

У меня есть три компонента. Элемент управления окнами (на заказ), основной класс и класс плагина.

Плагин генерирует событие обновления, где что-то должно быть добавлено в элемент управления. Это может быть строка, строка с URL-адресом или другой элемент управления, но, возможно, в будущем, что-то еще.

Какой лучший способ создать что-то подобное?

Edit:

Я должен был быть немного яснее. Проблема, которую я хочу решить, заключается в том, как по-разному реагировать на конкретный предмет.

например: плагин может выбрать просто добавить текст. Он отправляет событие, и основной класс должен вызывать соответствующие методы. Но другой плагин может выбрать добавление пользовательского элемента управления, поэтому основной класс должен вызывать разные методы.

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

(кстати, не воспринимайте слово плагин слишком буквально. Сейчас они просто классы в проекте).

Ответы [ 3 ]

0 голосов
/ 28 марта 2009

Вы можете использовать шаблон Event Aggregator

Также проверьте http://codebetter.com/blogs/jeremy.miller/archive/2007/06/29/build-your-own-cab-11-event-aggregator.aspx

0 голосов
/ 25 мая 2015

используйте шаблон проектирования модель-представление-контроль и в ваших представлениях передайте callBackFunctions, которые вы хотите, чтобы они выполнялись. увидеть это:

-- the code is in LUA
-- **** I create an answerBox, and when user tap this answerBox I want to print->"test"

local answerBox = require "view.answerBox"
local test = answerBox:new()
test.init("text for your answerBox", "1", function () print "answerBox was tapped by the user" end)

и в классе answerBox я получаю функцию и вызываю ее при касании объекта:

-- constructor
function new( self, message, id, callBackFunction, obj )
    function callBackFunction( event )            
        callBackFunction(event)
    end
    obj.answerBox:addEventListener( "tap", callBackFunction )
end

Будьте осторожны при использовании этой структуры. в этой структуре класс answerBox находится в представлении, а функция CallBackFunction находится в контроллере. Вы даже можете использовать некоторую логику из вашей модели вместо function () print "test" end

надеюсь, это поможет. ;)

0 голосов
/ 28 марта 2009

Звучит довольно просто. Я бы предложил использовать интерфейс для вашего класса плагинов.

interface IPlugin
{
    event EventHandler PluginUpdateEvent;
}

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

После загрузки плагина вы должны убедиться, что форма подписана на PluginUpdateEvent для этого плагина, и добавить обработчик события, чтобы заняться событием и добавить в форму все необходимое.

...