Windows phone 7 如何刷新第页上的datacontext
我正在WP8应用程序中使用MVVM。我有一个登录页(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
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));
}
}
}