将值从WPF页面传递到其父窗口

时间:2010-03-09 10:49:56

标签: wpf delegates

我希望有一些指导。我有一个wpf应用程序,它包含一个窗口(Window1)和一个页面(Page1)。页面使用框架在窗口内。

我在页面中有一个按钮,我希望能够按下并将字符串值传回主窗口并将其显示在标签内。

任何人都可以帮助我找一个基本的例子,因为我没有线索!

1 个答案:

答案 0 :(得分:0)

一般来说,您需要在应用程序中使用某种类型的发布者/订阅者模式事件服务。这将是您的外部窗口可以订阅的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的字典。您的AddListener会检查事件名称是否已存在,如果已存在,请将新委托添加到event。如果没有,它将在字典中创建一个新条目,并将新代理存储在event中。

大多数应用程序框架在某些时候都会使用这种模式,所以如果你不想编写自己的模式,我肯定有很多选择。看一下Prism Event Aggregator。 This is a short introduction,但无论您是自己编写还是获取预先存在的解决方案,基本格式都将保持不变。

这种方法的基本优点是松耦合和可扩展性。它也非常适合MVVM架构,您的ViewModel可以在其中引发其他ViewModel响应的事件。这使您可以从View中获取业务逻辑,并进入可以更完整地测试它的位置。

虽然我不推荐它,但“快速和脏”解决方案的另一个选择是向您的页面添加一个事件并让Window为其添加处理程序。然后,页面可以引发此自定义事件。你想要注意的事情是垃圾收集(如果你没有正确删除处理程序,你的页面可能无法获得GC)并确保你不会结束许多页面,每个页面都会引发一个稍微不同的事件