события между несвязанными классами - PullRequest
2 голосов
/ 09 июля 2011

У меня есть класс A, который является контекстом данных моего главного окна. У меня есть класс B, который является моделью представления одного из окон приложения. Нет связи между классами.

Мне нужно как-то вызвать событие в классе B, в то время как обработчик событий находится в классе A.

Возможно ли это сделать?

Пример того, что я делаю: я пытаюсь изменить заголовок главного окна из класса B.

Спасибо за помощь

Ответы [ 2 ]

6 голосов
/ 09 июля 2011

В моей книге вы должны смотреть на мессенджер / агрегатор событий для pub / sub. PRISM поставляется с одним, так что делайте такие вещи, как инструментарий MVVM Light, или вы можете получить мой собственный файл «drop in cs» от Github - TinyMessenger .

Это позволяет разделить связь - единственное, что объединяет издателя и подписчика, - агрегатор и сам формат сообщения. Если классы не связаны и, вероятно, построены отдельно, не следует связывать их с событием. Если вы используете событие, вы должны знать о последствиях GC подписки на событие, если ожидается, что время жизни двух классов будет различным.

Итак, в очень простом примере в классе А вы бы сделали что-то вроде

this.messenger.Subscribe<TitleChangeMessage>(m => <do some stuff>);

Затем в классе B, когда вы захотите запустить «событие», вы будете делать:

this.messenger.Publish(new TitleChangedMessage("new title"));
1 голос
/ 09 июля 2011

Вам просто нужно сделать событие в классе B общедоступным и присоединить к нему делегата из класса A.Вот пример: конструктор B запускает фоновую задачу, которая ждет 2 секунды, а затем вызывает событие.Конструктор A создает объект b типа B и присоединяет его делегат к событию b.В основной функции создается объект класса A, а затем поток переводится в спящий режим на 5 секунд.До истечения этого времени событие уже было запущено и обработано.

    class A
    {
        private B b;

        public A()
        {
            b = new B();
            b.MyEvent += MyHandler;
        }

        public void MyHandler(string s)
        {
        }

        public static void Main(string[] args)
        {
            A a = new A();

            Thread.Sleep(5000);
        }
    }

    class B
    {
        public B()
        {
            Task.Factory.StartNew(() =>
            {
                Thread.Sleep(2000);
                MyEvent("");
            });
        }

        public delegate void MyDelegate(string s);
        public event MyDelegate MyEvent;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...