绑定MobileServiceCollection不在UI中更新(MVVM)

时间:2014-03-18 07:35:49

标签: c# mvvm windows-phone-8 binding azure-mobile-services

我的视图模型中有一个移动服务集合,它从云中的移动服务数据库中获取数据。我正在尝试将此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; }
}

如果有人可以帮我解决这个问题,那就非常感兴趣

1 个答案:

答案 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}">