2013-05-19 56 views
1

我在WP8应用程序中使用MVVM。我有一个着陆页(AllProducts.xaml),显示产品列表。在构造我有this.DataContext = productsViewModel;我如何刷新页面上的datacontext

AllProducts.xaml,我有一个

  1. listbox结合的productsViewModel一个属性(ProductList)。

  2. 带有ADD按钮的应用程序栏,它将用户转到AddProduct.xaml页面。在这里,用户添加一个新的产品,它被保存在数据库中。保存方法被调用后,我有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"/> 

这里,ProductList属性我productsViewModel

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)); 
      } 
     } 
    } 

这是我的产品列表类。

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

回答

0

你总得让约束力知道它需要查询吸气.. 因此添加新项

RaisePropertyChanged(() => productsViewModel); 

or make productsViewModel an ObservableCollection 
+0

但用户在AddProduct.xaml页面中添加新的Product/item。完成保存后,我让他回到AllProducts.xaml页面。在这里我没有看到新添加的项目。我如何让再次启动AllProducts.xaml的数据绑定? 你能解释一下我需要调用RaisePropertyChanged(()=> productsViewModel);如何 ? – NoobDeveloper

+0

养育属性改变将“踢/重新查询绑定”。如果您不知道如何提高属性更改,请查看界面INotifiyPropertyChanged。让你的视图模型实现它。然后提高它的属性,你想绑定重新查询 –

+0

我的viewmodel已经实现INotifiyPropertyChanged。 – NoobDeveloper

0
public class productsViewModel: INotifyPropertyChanged 
    { 
     private IEnumerable<Product> _productList; 
public IEnumerable<Product> ProductList 
{ 
    get 
    { 
     return _productList; 
    } 

    set 
    { 
     if (_productList!= value) 
     { 
      _productList= value; 
      this.OnPropertyChanged("ProductList"); 
     } 
    } 
} 
     ...... 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void NotifyPropertyChanged(String info) { 
      if (PropertyChanged != null) { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 
    } 
+0

我已更新我的问题。 – NoobDeveloper

+0

尝试在您的视图中使用:保护覆盖无效OnNavigatedTo(NavigationEventArgs e) { //在此处更新您的模型 base.OnNavigatedTo(e); } –

0

使用一个ObservableCollection应该已经处理到列表中的任何更改后,任何绑定到我的列表“ProductsList”下面的任何内容都会自动在UI中更新。请注意,您的DataContext是MainViewModel,“ProductsList”是列表框的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)); 
     } 
    } 
}