Pregunta

Así que estoy intentando mover un programa de escritorio que creé a una aplicación para Windows 8.1 usando Visual Studio 2013. Datagrid quedó obsoleto para esta versión, por lo que estoy intentando traducirlos a un ListView.Yo anteriormente usé ListViews en otras aplicaciones de escritorio, pero parece que muchas cosas han cambiado.El problema que estoy teniendo es poblar mi ListView de mi base de datos.Me estoy conectando a través de un WCF Service y al revisar el código, puedo ver que estoy obteniendo los datos correctos, pero no puedo hacer que aparezcan en mi ListView.Mi resultado final preferido sería una 'vista de lista' con 3 columnas de información que será editable.Anteriormente usaría ListView.View y luego poner un GridView allí para las columnas.pero parece ListView.View está en desuso al igual que GridView.Columns.

aquí está mi xaml para el 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>

En mi código subyacente estoy asignando la fuente de elementos de mi vista de lista.

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

VMInventory es mi ViewModel de donde obtengo mis datos del WCF service y eso se parece a:

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

Una última nota al margen, pude agregar un cuadro de texto al Grid y cuando yo DataBind eso a text="{Binding Current.InventoryName}" Puedo vincularlo con éxito.

¿Fue útil?

Solución

Si entiendo correctamente, su interfaz de usuario no se actualiza con los valores que agregue en ViewModel, pero si agrega algún valor en la interfaz de usuario, se refleja en ViewModel.

Si ese es el caso, use ObserableCollection en lugar de la lista, y si crea una lista cada vez, entonces debe implementar INotifyPropertyChanged en su ViewModel.

Si ha hecho todo esto pero aún no se actualiza, entonces está creando la lista en asy Task, que no es un hilo de UI.Si desea actualizar una interfaz de usuario desde un subproceso que no es de interfaz de usuario, utilice la actualización de la interfaz de usuario mediante Dispatcher.Puede encontrar muchos ejemplos para actualizar la interfaz de usuario desde un hilo que no es de interfaz de usuario utilizando el despachador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top