Listiew Data Binding per le app di Windows 8.1 Store
-
20-12-2019 - |
Domanda
Quindi sto cercando di spostare un programma desktop che ho fatto a un'app per Windows 8.1
utilizzando Visual Studio 2013
. Datagrid
è stato deprecato per questa versione, quindi sto cercando di tradurre quelli oltre a un ListView
. In precedenza ho usato ListViews
in altre applicazioni desktop, ma sembra che molto sia cambiato. Il problema che sto avendo popolato il mio ListView
dal mio database. Sto connettendo attraverso un WCF Service
e passando attraverso il codice, posso vedere che sto ottenendo i dati giusti, non riesco a farlo apparire nella mia lista di listview. Il mio risultato finale preferito sarebbe un 'ListView' con 3 colonne di informazioni che saranno modificabili. In precedenza utilizzerei ListView.View
e quindi inserire un GridView
in là per le colonne. Ma sembra che ListView.View
sia deprecato proprio come GridView.Columns
.
Ecco il mio XAML per il 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>
.
Nel mio codice di codice sto assegnando gli elementi del mio elenco.
VMInventory inventory = new VMInventory();
inventory.GetList();
lvInventory.ItemsSource = inventory;
.
VMInventory
è il mio ViewModel
in cui ricevo i miei dati dal WCF service
e che assomiglia 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);
}
.
Un'ultima nota laterale, sono stato in grado di aggiungere una casella di testo al Grid
e quando I DataBind
IT su text="{Binding Current.InventoryName}"
I è in grado di legarlo con successo.
Soluzione
Se capisco correttamente il tuo interfaccia utente non viene aggiornato con i valori che esagerare in ViewModel, ma se aggiungi un valore in ui, si riflette nel ViewModel.
Se questo è il caso, l'utilizzo dell'osservabileCollection anziché l'elenco e se la tua lista di creazione ogni volta, è necessario implementare InotifyPropertyChanged nel tuo ViewModel.
Se hai fatto tutto questo ma ancora non è aggiornato, allora stai creando l'elenco in Asy Task, che non è una filettatura UI.Se si desidera aggiornare un UI da un thread non ui, utilizzare aggiornare l'interfaccia utente utilizzando il dispatcher.Puoi trovare molti esempi per aggiornare l'interfaccia utente da Thread non ui utilizzando Dispatcher