2013-11-15 64 views
0

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

,这里是我的ListView

<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的XAML的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,当我DataBind它到text="{Binding Current.InventoryName}"我能够成功地绑定它。

回答

1

如果我理解正确,你的UI没有得到更新值,你在ViewModel中添加什么,但是如果你在UI中添加一些值,它将反映在ViewModel中。

如果是这样,使用ObserableCollection而不是列表,并且如果您每次创建列表,则必须在您的ViewModel中实现INotifyPropertyChanged。

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

+0

UI没有得到更新,如果我对UI进行了更改,它不会反映在视图模型中。视图模型填充得很好,它只是不会在UI中显示。我试着将它改为可观察的集合。 re:异步任务,当使用“Current.InventoryName”绑定将其绑定到文本框时,它将数据绑定和显示数据。但我不能使用LV的电流,因为我需要所有这些,而不仅仅是一个。 –

+0

@Kumareshan是正确的,ObservableCollection是答案。如果您想从任务(不在UI线程上运行)更新它,则需要查看CoreDispatcher,否则您将收到编组错误。 –

+0

好的,我将调整我的var查询以返回ObservableCollection而不是IEnumerable。一旦我这样做,那么我的数据绑定将以他们的方式工作?当我可以直接访问数据库时,这在WPF中更容易。 –

相关问题