Windows phone 7 如何在页面导航后刷新数据透视项的DataContext

Windows phone 7 如何在页面导航后刷新数据透视项的DataContext,windows-phone-7,mvvm,windows-phone,Windows Phone 7,Mvvm,Windows Phone,在WP 7.1项目中,我有一个MainPage.xaml。在这里,我有一个来自WP Toolkit的Pivot控件,如下所示: ... 基本上,我将第一个透视项的内容设置为我创建的名为ListView的UserControl,并为其创建了名为ListViewModel的视图模型 使用以下简单的模型类: 公共类MyModel{ 公共int Id{get;set;} 公共字符串名称{get;set;} } ListView视图的xaml如下所示: 。。。 ... 对于列表中的每个项目,只需一

在WP 7.1项目中,我有一个MainPage.xaml。在这里,我有一个来自WP Toolkit的Pivot控件,如下所示:


...
基本上,我将第一个透视项的内容设置为我创建的名为ListView的UserControl,并为其创建了名为ListViewModel的视图模型

使用以下简单的模型类:

公共类MyModel{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
ListView视图的xaml如下所示:

。。。
...
对于列表中的每个项目,只需一个简单的两行条目。名称显示在第一行,该按钮用于编辑该项目。此视图的视图模型为:

。。。
私有可观测集合模型项;
公共可观测集合模型项{
获取{return modelItems;}
设置{
如果(modelItems!=值){
模型项=值;
NotifyPropertyChanged(()=>this.ModelItems);
}
}
}
公共ListViewModel(){
ModelItems=新的ObservableCollection(repository.GetAll());
}
公共ICommand edit命令{
得到{
返回新的RelayCommand(o=>{
var模型=o作为MyModel;
Navigator.Uri()
.WithParam(“id”,model.id)
.导航();
}
}
...
到目前为止,一切正常,列表已正确填充。单击按钮可正确导航到EditView视图,并传递所选模型项的id

EditView页面很简单,只有一个文本框和一个保存按钮。该页面的视图模型如下所示:

。。。
public EditViewModel(){//
var id=GetQueryString(“id”);
Model=repository.Get(id);
}
...
编辑页面工作正常,它将更改保存回数据库。但是,在保存操作后,我执行了一个
Navigator.GoBack()
,旧数据显示在那里。我应该如何强制列表更新新更改,同时避免代码落后

我能够在主页代码中使用pivot控件加载事件实现这一点,如下所示:

private void pivot\u加载(对象发送方,路由目标){
var selectedPivotItem=(PivotItem)pivot.SelectedItem;
((ListViewModel)selectedPivotItem.DataContext).Rebind();
}
我在我的ListViewModel中添加了一个
Rebind()
方法,该方法的作用与构造函数基本相同,再次获取所有数据并将其分配给
ModelItems

有没有一种不用编写任何代码就能实现这一点的方法


谢谢

我使用singleton模式创建了一个名为
AppLifeService
的类。在这个对象中,我存储了各种属性,用于页面之间的导航

当您在执行操作(编辑/删除/创建)的页面中时,只需将修改后的对象放入
AppLifeService
的某些属性中,如
DeletedComment

然后在上一页的
OnNavigatedTo
方法中,验证这是一个向后导航并搜索您的对象

    protected override void OnNavigatedTo(NavigationEventArgs e, NavigationContext context, NavigationService navigationService)
    {
        base.OnNavigatedTo(e, context, navigationService);

        // back from other app page
        if (e.NavigationMode == NavigationMode.Back)
        {
            var lifeService = ApplicationServices.Resolve<AppLifeService>();
受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e、NavigationContext上下文、NavigationService NavigationService)
{
base.OnNavigatedTo(e、上下文、导航服务);
//从其他应用程序页面返回
if(e.NavigationMode==NavigationMode.Back)
{
var lifeService=ApplicationServices.Resolve();
新界? var deletedComment=lifeService.deletedComment; if(deletedComment!=null) { //删除评论 }

确保不要存储重物,以免堵塞内存。使用时请将其删除