如何在页面上刷新datacontext

时间:2013-05-19 16:16:30

标签: windows-phone-7 mvvm windows-phone-8

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

AllProducts.xaml中,我有一个

  1. listbox绑定到ProductList的属性(productsViewModel)。

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

  3. 但是,AllProducts.xaml现在会显示新添加的产品。这很明显&我认为这是因为NavigationService.GoBack();只恢复了上一页的状态而没有重新绑定它。

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

    以下是AllProducts.xaml中的xaml代码,该代码绑定到ProductList的{​​{1}}属性

    productsViewModel

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

    productsViewModel

    这是我的ProductList类。

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

3 个答案:

答案 0 :(得分:0)

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

RaisePropertyChanged(() => productsViewModel);

or make productsViewModel an ObservableCollection

答案 1 :(得分: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));
            }
        }
    }

答案 2 :(得分: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));
        }
    }
}