2013-05-19 5 views
1

WP8 앱에서 MVVM을 사용하고 있습니다. 제품 목록을 표시하는 방문 페이지 (AllProducts.xaml)가 있습니다. 생성자에서 제가페이지의 datacontext를 새로 고침하는 방법

AllProducts.xaml에서 this.DataContext = productsViewModel;

가 나는 productsViewModel의 속성 (ProductList)에

  1. listbox 바인드를 갖는다.

  2. 사용자를 AddProduct.xaml 페이지로 연결하는 추가 버튼이있는 앱 표시 줄입니다. 여기서 사용자는 데이터베이스에 저장되는 새 제품을 추가합니다. Save 메서드를 호출 후, 나는 이전 페이지 (AllProducts.xaml)

는 그러나, AllProducts.xaml 이제 새로 추가 된 제품을 보여줍니다 않습니다에 사용자가 걸립니다 NavigationService.GoBack(); 있습니다. 이것은 분명하다 & 나는 단지 이전 페이지의 상태를 복원하고 다시 바인딩하지 않기 때문에 NavigationService.GoBack();라고 생각합니다.

페이지를 리바 인/새로 고침하여 새로 추가 된 제품이 목록에 표시되도록하려면 어떻게해야합니까?

여기 여기 productsViewModel

<phone:LongListSelector ItemsSource="{Binding GetProductList, Mode=TwoWay}" 
         Name="lls" 
         ItemTemplate="{StaticResource MyDataTemplateHere}" 
         toolkit:TiltEffect.IsTiltEnabled="True" 
         SelectionChanged="lls_SelectionChanged"/> 

ProductList 속성에 바인딩 AllProducts.xaml의 XAML 코드는 여기 내 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

당신이 할 수 바인딩는 게터를 조회 할 필요가 있음을 알 겠어요 .. 아직 목록에 대한 변경을 처리해야 ObservableCollection에를 사용하여 새 항목

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

보기에서 사용해보기 : protected override void OnNavigatedTo (NavigationEventArgs e) { // 여기에서 모델 업데이트 base.OnNavigatedTo (e); } –

0

을 추가 한 후 , 아래 목록의 "제품 목록"에 바인딩 된 항목은 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)); 
     } 
    } 
} 
관련 문제