因此,我尝试使用Windows 8.1
将我制作的桌面程序移至Visual Studio 2013
的应用。此版本已弃用Datagrid
,因此我尝试将其转换为ListView
。我之前在其他桌面应用程序中使用过ListViews
,但看起来已经发生了很多变化。我遇到的问题是从我的数据库中填充ListView
。我通过WCF Service
连接并逐步执行代码,我可以看到我正在获取正确的数据,我不能让它出现在我的ListView中。我首选的最终结果是“列表视图”,其中包含3列可编辑的信息。以前我会使用ListView.View
,然后在其中放置GridView
列。但似乎ListView.View
似乎已被弃用,就像GridView.Columns
一样。
这是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的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}"
时,我能够成功绑定它。
答案 0 :(得分:1)
如果我理解正确您的UI没有更新您在ViewModel中添加的值,但是如果您在UI中添加了一些值,则会反映在ViewModel中。
如果是这种情况,则使用ObserableCollection而不是list,如果每次创建列表,则必须在ViewModel中实现INotifyPropertyChanged。
如果您已经完成了所有这些但仍然没有更新,那么您在asy Task中创建列表,这不是UI线程。如果要从非Ui线程更新UI,请使用Dispatcher更新UI。您可以找到很多示例来使用调度程序从非UI线程更新UI