Question

J'essaie donc de déplacer un programme de bureau que j'ai créé vers une application pour Windows 8.1 en utilisant Visual Studio 2013. Datagrid était obsolète pour cette version, j'essaie donc de les traduire dans un ListView.J'ai déjà utilisé ListViews dans d'autres applications de bureau, mais il semble que beaucoup de choses ont changé.Le problème que j'ai est de remplir mon ListView de ma base de données.Je me connecte via un WCF Service et en parcourant le code, je peux voir que j'obtiens les bonnes données, je n'arrive tout simplement pas à les faire apparaître dans mon ListView.Mon résultat final préféré serait une « liste » avec 3 colonnes d’informations qui seront modifiables.Auparavant, j'utilisais ListView.View puis mettez un GridView là pour les colonnes.Mais il semble ListView.View est obsolète tout comme GridView.Columns.

voici mon xaml pour le 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>

Dans mon codebehind, j'attribue la source d'éléments de ma liste.

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

VMInventory est mon ViewModel où je récupère mes données du WCF service et ça ressemble à :

 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);
}

Une dernière remarque, j'ai pu ajouter une zone de texte au Grid et quand je DataBind à text="{Binding Current.InventoryName}" Je suis capable de le lier avec succès.

Était-ce utile?

La solution

Si je comprends bien, votre interface utilisateur n'est pas mise à jour avec les valeurs que vous ajoutez dans ViewModel, mais si vous ajoutez une valeur dans l'interface utilisateur, cela se reflète dans ViewModel.

Si tel est le cas, utilisez ObserableCollection au lieu de list, et si vous créez une liste à chaque fois, vous devez alors implémenter INotifyPropertyChanged dans votre ViewModel.

Si vous avez fait tout cela mais que la mise à jour n'est toujours pas effectuée, vous créez la liste dans asy Task, qui n'est pas un fil d'interface utilisateur.Si vous souhaitez mettre à jour une interface utilisateur à partir d'un thread non-UI, utilisez Mettre à jour l'interface utilisateur à l'aide de Dispatcher.Vous pouvez trouver de nombreux exemples pour mettre à jour l'interface utilisateur à partir d'un thread non-UI à l'aide du répartiteur

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top