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

这是我的 xaml 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>

在我的代码隐藏中,我分配了列表视图的项目源。

        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}" 我能够成功绑定它。

有帮助吗?

解决方案

如果我理解正确的话,你的 UI 不会随着你在 ViewModel 中添加的值而更新,但是如果你在 UI 中添加一些值,它就会反映在 ViewModel 中。

如果是这种情况,请使用 ObserableCollection 而不是列表,并且如果您每次都创建列表,那么您必须在 ViewModel 中实现 INotifyPropertyChanged。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top