2013-05-19 89 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)); 
     } 
    } 
}