Windows phone 7 如何刷新第页上的datacontext

Windows phone 7 如何刷新第页上的datacontext,windows-phone-7,mvvm,windows-phone-8,Windows Phone 7,Mvvm,Windows Phone 8,我正在WP8应用程序中使用MVVM。我有一个登录页(AllProducts.xaml),其中显示产品列表。在构造函数中,我有this.DataContext=ProductsView Model 在AllProducts.xaml中,我有一个 listbox绑定到productsViewModel的属性(ProductList) 带有“添加”按钮的应用程序栏,可将用户带到AddProduct.xaml页面。在这里,用户添加了一个新产品,该产品保存在数据库中。调用save方法后,我有Navigat

我正在WP8应用程序中使用MVVM。我有一个登录页(
AllProducts.xaml
),其中显示产品列表。在构造函数中,我有
this.DataContext=ProductsView Model

AllProducts.xaml
中,我有一个

  • listbox
    绑定到
    productsViewModel
    的属性(
    ProductList

  • 带有“添加”按钮的应用程序栏,可将用户带到
    AddProduct.xaml
    页面。在这里,用户添加了一个新产品,该产品保存在数据库中。调用save方法后,我有
    NavigationService.GoBack()
    将用户带到上一页(
    AllProducts.xaml

  • 但是,
    AllProducts.xaml
    现在显示新添加的产品。这是显而易见的&我认为这是因为
    NavigationService.GoBack()
    只恢复上一页的状态,不重新绑定

    如何重新绑定/刷新页面,以便在列表中显示新添加的产品

    下面是
    AllProducts.xaml
    中的xaml代码,它绑定到
    productsViewModel

    <phone:LongListSelector ItemsSource="{Binding GetProductList, Mode=TwoWay}"
                            Name="lls"
                            ItemTemplate="{StaticResource MyDataTemplateHere}"
                            toolkit:TiltEffect.IsTiltEnabled="True" 
                            SelectionChanged="lls_SelectionChanged"/>
    
        public class productsViewModel: INotifyPropertyChanged
        {
        private ObservableCollection<ProductList> _productList;
                public ObservableCollection<ProductList> GetProductList
                {
                    get
                    {
                        var prodList = from p in unitOfWork.ProductRepository.GetAll()
                                      join c in unitOfWork.CustomerRepository.GetAll()
                                      on p.CustId equals c.CustId
                                      select new ProductList { ProductId = p.Id, ProductName = p.ProductName, CustomerId = c.CustId};
                        _productList= new ObservableCollection<ProductList>(prodList .ToList());
                        return _productList;
                    }
                    set
                    {
                        _productList= value;
                        OnPropertyChanged("GetProductList");
                    }
                }
    
    
    public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    
    这是我的ProductList类

     public class ProductList
        {
            public int ProductId { get; set; }
            public string  ProductName { get; set; }
            public int CustomerId { get; set; }
        }
    

    您必须让绑定知道它需要查询getter。。 所以在添加新项目之后

    RaisePropertyChanged(() => productsViewModel);
    
    or make productsViewModel an ObservableCollection
    
    公共类productsViewModel:INotifyPropertyChanged
    {
    私有IEnumerable\u产品列表;
    公共IEnumerable产品列表
    {
    得到
    {
    返回产品列表;
    }
    设置
    {
    if(_productList!=值)
    {
    _productList=值;
    此.OnPropertyChanged(“ProductList”);
    }
    }
    }
    ......
    公共事件属性更改事件处理程序属性更改;
    受保护的void NotifyPropertyChanged(字符串信息){
    if(PropertyChanged!=null){
    PropertyChanged(此,新PropertyChangedEventArgs(信息));
    }
    }
    }
    
    使用ObservableCollection应该已经处理列表的任何更改,绑定到下面我的列表“ProductsList”的任何内容都将在UI中自动更新。请注意,您的DataContext是MainViewModel,“ProductsList”是listbox的ItemsSource

        public class MainViewModel : INotifyPropertyChanged
    {
        public MainViewModel()
        {
            this.ProductsList = new ObservableCollection<Products>();
        }
    
        public ObservableCollection<Products> ProductsList { get; set; }
    
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (null != handler)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    public类主视图模型:INotifyPropertyChanged
    {
    公共主视图模型()
    {
    this.ProductsList=新的ObservableCollection();
    }
    公共ObservableCollection产品列表{get;set;}
    公共事件属性更改事件处理程序属性更改;
    私有void NotifyPropertyChanged(字符串propertyName)
    {
    PropertyChangedEventHandler处理程序=PropertyChanged;
    if(null!=处理程序)
    {
    处理程序(这是新的PropertyChangedEventArgs(propertyName));
    }
    }
    }
    
    但是用户在AddProduct.xaml页面中添加了新产品/项目。在他完成保存后,我让他返回AllProducts.xaml页面。这里我没有看到新添加的项目。如何让AllProducts.xaml的数据绑定重新启动?你能解释一下我需要在哪里调用RaisePropertyChanged(()=>productsViewModel);如何更改?提升属性将“踢/重新查询绑定”。如果您不知道如何引发属性更改,请查看接口INotifiyPropertyChanged。让您的viewmodel实现它。然后为您希望绑定重新queryperfect的属性引发它!当需要绑定响应时引发:)\只需让绑定知道您更改了什么。在您掌握的时间和方式方面,我正在阅读的下面的其他帖子正试图以这种方式指导和帮助您。请尝试在您的视图中使用:protectedoverride void OnNavigatedTo(NavigationEventArgs e){//在此处更新您的模型base.OnNavigatedTo(e);}
        public class MainViewModel : INotifyPropertyChanged
    {
        public MainViewModel()
        {
            this.ProductsList = new ObservableCollection<Products>();
        }
    
        public ObservableCollection<Products> ProductsList { get; set; }
    
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (null != handler)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }