适用于Windows 8.1 Store Apps的ListView数据绑定

时间:2013-11-15 16:19:58

标签: wpf listview data-binding windows-store-apps windows-8.1

因此,我尝试使用Windows 8.1将我制作的桌面程序移至Visual Studio 2013的应用。此版本已弃用Datagrid,因此我尝试将其转换为ListView。我之前在其他桌面应用程序中使用过ListViews,但看起来已经发生了很多变化。我遇到的问题是从我的数据库中填充ListView。我通过WCF Service连接并逐步执行代码,我可以看到我正在获取正确的数据,我不能让它出现在我的ListView中。我首选的最终结果是“列表视图”,其中包含3列可编辑的信息。以前我会使用ListView.View,然后在其中放置GridView列。但似乎ListView.View似乎已被弃用,就像GridView.Columns一样。

这是ListView

的我的xaml
<ListView x:Name="lvInventory" Grid.Row="2" Style="{StaticResource listViewStyle}" ItemsSource="{Binding}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid Height="200"  Width="200">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock x:Name="tbName" Text="{Binding InventoryName}" Width="200" Foreground="#FF0E0D0D" />
                        <TextBox x:Name="tbQty" Grid.Column="1"/>
                        <TextBox x:Name="tbType" Grid.Column="2"/>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

在我的代码隐藏中,我正在分配listview的itemssource。

        VMInventory inventory = new VMInventory();            
        inventory.GetList();
        lvInventory.ItemsSource = inventory;

VMInventory是我的ViewModel,我从WCF service获取数据,看起来像是:

 public async Task GetList()
    {

            this.connection = new InventoryModelEntities(new Uri(url));
            var filteredList = from o in connection.Inventory
                               where o.Have == false
                               select o;
            var query = await Task.Factory.FromAsync((filteredList as DataServiceQuery).BeginExecute(null, null),
                (result) => (filteredList as DataServiceQuery).EndExecute(result)) as IEnumerable<Aurora.InventoryService.Inventory>;

            this.inventoryList = query.ToList();
            this.currentItem = 0;
            this.onPropertyChanged("Current");
            this.IsAtStart = true;
            this.IsAtEnd = (inventoryList.Count == 0);
}

最后一点注意,我能够向Grid添加一个文本框,当我DataBindtext="{Binding Current.InventoryName}"时,我能够成功绑定它。

1 个答案:

答案 0 :(得分:1)

如果我理解正确您的UI没有更新您在ViewModel中添加的值,但是如果您在UI中添加了一些值,则会反映在ViewModel中。

如果是这种情况,则使用ObserableCollection而不是list,如果每次创建列表,则必须在ViewModel中实现INotifyPropertyChanged。

如果您已经完成了所有这些但仍然没有更新,那么您在asy Task中创建列表,这不是UI线程。如果要从非Ui线程更新UI,请使用Dispatcher更新UI。您可以找到很多示例来使用调度程序从非UI线程更新UI