在Windows Phone上更新多个页面的控件

时间:2012-04-06 09:38:46

标签: windows-phone-7 user-controls

全部,我是Windows 7手机的新手。我的情况是我有一个包含ScrollViewer的主页面,而StackPanel则包含StackPanel。我想用多个子StackPanel(在运行时)填充这个PhoneApplicationService.Current.State["yourparam"] = param NavigationService.Navigate(new Uri("/view/Page.xaml", UriKind.Relative)); ,这将保持Image Thumb钉子的超链接和一些关于图像的基本信息。

当我从主页面执行此操作时,这一切都很好,但我想知道如何更新此控件(位于主页面上),但是要从主页以外的任何页面更新。我想知道从另一个页面更新页面控件(如上所述)的最佳实践。

显然,有很多方法可以在页面之间传递数据

var k = PhoneApplicationService.Current.State["yourparam"];

然后在其他页面中

{{1}}

和其他许多人。但从不同页面更新通用控件的最佳做法是什么?

注意:有很多关于数据访问和页面间传递的问题。

  1. Passing data from page to page
  2. How to pass the image value in one xaml page to another xaml page in windows phone 7?
  3. Passing image from one page to another windows phone 7
  4. 等等。这不是我要问的。

2 个答案:

答案 0 :(得分:3)

如果我正确理解了您的问题,那么您正尝试从另一个页面(例如Page2.xaml)更新一个控件,例如MainPage.xaml。

据我所知,没有办法从另一个页面到达页面控件,这对于我能想到的案例来说似乎没有必要。

用于实现所尝试内容的方法通常通过触发操作(如按下按钮)并将参数传递给您尝试更新控件的页面来完成。在该页面的onnavigatedto事件(或viewmodel构造函数,如果您使用MVVM模式),根据传递的参数更新您的控件。

如果您的更新基于数据,那么最佳做法是绑定一个可观察集合或一个扩展INotifyPropertyChanged的对象(基本上任何可以表明其属性之一已更改为ui的对象)并根据数据更改数据传递的参数。

如果这两个页面在某种程度上同时可见并且它们之间不需要导航(如弹出窗口或滑动菜单类型的ui)那么您可以使弹出窗口中显示的页面成为用户控件,并且通过this.Parent到达父母的控件。

如果您提供有关应用流程的详细信息,我会更有帮助。

答案 1 :(得分:2)

MVVM模式将是一个很好的方式。对于小型团队而言,MVVM过于复杂并不准确 - MVVM的目的是解耦Silverlight或WPF代码。使用Silverlight页面的代码隐藏直接访问数据会在代码中产生耦合并产生技术债务。无论您是一个开发人员还是100个,如果您的UI与数据类相结合,如果您必须更改数据类,则必须对使用这些类的每个UI元素进行更改。这需要更长的时间,使您的应用程序更难以更改。

MVVM使得你的UI(View)对数据(你的模型)一无所知。 ViewModel是UI可以绑定的代码,用于管理UI中需要持久保存到Model的事件,以及需要在View中表示的Model中的更改。出于这个原因,它处理事件,这就是你在代码中需要的东西 - 一个可以存在于代码隐藏之外的事件,可以在数据发生变化时更新绑定到它的Views。如果您有两个页面,那么其中一个页面上的事件将被发送到ViewModel,如果需要,它将对Model(数据)进行更改,并将其传递回ViewModel。然后,ViewModel将更新绑定到该数据的任何UI元素(视图)。

有一个很好的演示如何实现MVVM设计模式here 。这个人经历了一个典型的WPF应用程序(就像Silverlight一样),其中UI代码隐藏实现了直接访问数据的事件处理程序,并使用MVVM模式对其进行重构。