我的视图模型中有一个移动服务集合,它从云中的移动服务数据库中获取数据。我正在尝试将此MobileServiceCollection绑定到我的ui中的Listbox(带有项模板)。但由于查询命令是异步的,因此ui不会更新。这是我在收到数据异步之前设置Listbox.ItemSource。 (我知道数据是通过断点接收的。(我知道我的绑定是正确的,我点击了按钮后设置了Listbox.Itemsource,然后数据显示在我的ui中)。
我知道这可能与NotifyChange有关,所以我尝试实现它。但我无法让它发挥作用。基本上我的问题是:
如何使用表示为MobileSericeCollection的异步数据源更新我的ui中的列表框。
这是我到目前为止所拥有的:
的Xaml:
<ListBox x:Name="ListOfProducts" ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock x:Name="tb1" Margin="0,0,0,0" Text="{Binding ProductName, Mode=TwoWay}"></TextBlock>
<TextBlock x:Name="tb2" Margin="200,0,0,0" Text="{Binding ProductPrice, Mode=TwoWay}"></TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
代码背后:
public partial class ProductList : PhoneApplicationPage
{
ProductListViewModel plvm = new ProductListViewModel();
public ProductList()
{
InitializeComponent();
ListOfProducts.ItemsSource = plvm.P;
}
}
视图模型:
class ProductListViewModel
{
public MobileServiceCollection<Product, Product> P;
public ProductListViewModel()
{
getProducts();
}
/// <summary>
/// Fetch all products from the database (async).
/// </summary>
private async void getProducts()
{
P = await App.MobileService.GetTable<Product>()
//.Where(Product => Product.ProductName == "tomato")
.OrderByDescending(Product => Product.ProductPrice)
.ToCollectionAsync();
}
}
型号:
[DataContract]
public class Product
{
[DataMember(Name = "id")]
public string id { get; set; }
[DataMember(Name = "ProductName")]
public string ProductName { get; set; }
[DataMember(Name = "ProductPrice")]
public float ProductPrice { get; set; }
}
如果有人可以帮我解决这个问题,那就非常感兴趣
答案 0 :(得分:3)
尝试这样做:
首先,使您的ProductListViewModel
实施INotifyPropertyChanged
。
第二,使P
成为属性而不是字段/成员,因为数据绑定仅适用于公共属性。并正确地提高了房产变更通知:
private MobileServiceCollection<Product, Product> _p;
public MobileServiceCollection<Product, Product> P
{
get { return _p; }
set
{
_p = value;
NotifyPropertyChanged("P");
}
}
第三次,正确设置视图的DataContext。数据绑定解析相对于视图的当前DataContext的路径:
ProductListViewModel plvm = new ProductListViewModel();
public ProductList()
{
InitializeComponent();
this.DataContext = plvm;
}
Forth ,将ItemsSource
绑定路径设置为DataContext / ProductListViewModel的P
属性:
<ListBox x:Name="ListOfProducts" ItemsSource="{Binding P}">