Передача значения со страницы WPF в окно его родителя - PullRequest
1 голос
/ 09 марта 2010

Я надеюсь на какое-то руководство.У меня есть приложение wpf, которое содержит окно (Window1) и страницу (Page1).Страница находится внутри окна с использованием фрейма.

У меня есть кнопка на странице, которую я хочу иметь возможность нажать и передать строковое значение обратно в главное окно и отобразить его в метке.

Может ли кто-нибудь помочь с базовым примером, поскольку я понятия не имею!

1 Ответ

0 голосов
/ 09 марта 2010

Вообще говоря, похоже, что вам нужна какая-то служба событий шаблонов издателя / подписчика в вашем приложении. Это будет объект Singleton, на который может подписаться ваше внешнее окно. Общий вызов этой службы может выглядеть примерно так:

EventService.Instance.AddListener( "TheEventICareAbout"
            , delegate( possiblySomeParameters ) {
                //Do Interesting Stuff Here.  This code can access members of your
                //window class or call methods on it to react to the event.
                } ) ;

Тогда ваша дочерняя страница может вызвать какое-то событие в сервисе:

EventService.Instance.RaiseEvent("TheEventICareAbout"
            , new EventParameters( possiblySomeParameters ) ) ;

Внутренне, сервис, вероятно, просто словарь имен событий и фреймворка event s. Ваш AddListener проверит, существует ли уже имя события, и, если это так, добавит нового делегата в event. Если нет, он создаст новую запись в словаре и сохранит новый делегат, как в event.

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

Основными преимуществами этого подхода являются слабая связь и расширяемость. Это также хорошо подходит для архитектуры MVVM, где ваша ViewModel может вызвать событие, на которое реагируют другие ViewModel. Это позволяет вам вывести свою бизнес-логику из своего View и в другое место, где вы можете проверить ее более полно.

Хотя я бы не рекомендовал этого, другой вариант для «быстрого и грязного» решения - добавить событие на вашу страницу и добавить в него обработчик Window. Страница может затем вызвать это пользовательское событие. Здесь вы должны быть осторожны с сборщиком мусора (ваша страница может не получить GCed, если вы не удалите обработчик должным образом) и убедитесь, что у вас не будет много страниц, каждая из которых вызывает немного другое событие .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...