Enlace de datos ListView para aplicaciones de la tienda Windows 8.1
-
20-12-2019 - |
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.
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.