Silverlight应用程序UI更新

时间:2012-07-22 00:15:15

标签: c# wpf silverlight oop asynchronous

我正在使用Windows Phone silverlight C#应用程序时遇到问题。

所以我想做这样的事情

  1. 按第一页上的按钮。按钮单击处理程序在其他类中调用异步方法MakeRequest以检索数据。异步方法将触发事件DataReadyEvent并将结果包装为DataEventArgs。此事件的处理程序将在Page2中。因此,在为此事件添加处理程序后,我从当前页面导航到Page2。
  2. 我希望通过后面的代码中的事件处理程序检索数据并在UI上更新它。但事件处理程序是静态的(因此我可以在page1代码中使用Page2.handler_method_name添加它,而无需创建页面的新实例。)。由于处理程序方法是静态的,我不能使用Dispatcher.Invoke并返回UI线程并更新UI。
  3. 所以在这种情况下,任何人都有任何想法吗?我只想在page1中调用异步方法,并在第2页中将结果更新为UI。谢谢

1 个答案:

答案 0 :(得分:1)

这是一个想法:不要让它静止。不要试图通过打破简单的OOP规则(如封装等)以及找到一些围绕您使用的框架的疯狂解决方法来为自己创建问题。

当你处于这种情况时,你应该停下来,回头思考,因为这表明你做了一些完全错误的事情。不要试图通过寻找黑客和变通方法来进一步推动它。相反,你应该重构并重用正确的范例。

例如,如果要在Page2上显示结果,那么就有一个Page2 ALREADY。所以有一个实例。那你为什么要使用静态处理程序呢? 可能是因为您没有对此页面的引用。那很好,通常你不应该。

但是当你完成计算时,你可以发布一个事件,说“嘿,这是完成的任务”。那时你不应该关心谁对这个结果感兴趣,这不是工人的担忧。 这意味着计算本身的逻辑可能应该从Page1移出。真的,页面关注的是圆顶表示逻辑,仅此而已。 Page1应该提出需要进行某些计算的请求。这将是一个外部组件(可能是你的ViewModel中的一些东西)来实际实现它。

因此,当结果准备好被消费时,您可以简单地将其推送到ViewModel(更新一些可观察的属性或集合等),因此如果有任何UI(或其中许多或其他组件)感兴趣这些数据将自动通知,并显示数据。

但请不要试图破解,它会在未来引起你更大的痛苦。