ListView-Datenbindung für Windows 8.1 Store-Apps
-
20-12-2019 - |
Frage
Ich versuche also, ein Desktop-Programm, für das ich erstellt habe, in eine App zu verschieben Windows 8.1
wobei Visual Studio 2013
. Datagrid
war für diese Version veraltet, also versuche ich, diese in eine zu übersetzen ListView
.Ich habe vorher benutzt ListViews
in anderen Desktop-Anwendungen sieht es aber so aus, als hätte sich viel geändert.Das Problem, das ich habe, ist, meine zu bevölkern ListView
aus meiner Datenbank.Ich verbinde mich über eine WCF Service
wenn ich durch den Code gehe, kann ich sehen, dass ich die richtigen Daten erhalte. Ich kann sie einfach nicht in meiner Listenansicht anzeigen lassen.Mein bevorzugtes Endergebnis wäre eine 'Listenansicht' mit 3 Informationsspalten, die bearbeitet werden können.Früher würde ich verwenden ListView.View
und dann ein GridView
dort für die Spalten.Aber es scheint ListView.View
ist genauso veraltet wie GridView.Columns
.
hier ist meine xaml für die 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>
In meinem Codebehind weise ich die itemssource meiner Listenansicht zu.
VMInventory inventory = new VMInventory();
inventory.GetList();
lvInventory.ItemsSource = inventory;
VMInventory
ist mein ViewModel
woher bekomme ich meine Daten von der WCF service
und das sieht so aus:
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);
}
Eine letzte Randnotiz, ich konnte dem ein Textfeld hinzufügen Grid
und wenn ich DataBind
es zu text="{Binding Current.InventoryName}"
Ich kann es erfolgreich binden.
Lösung
Wenn ich das richtig verstehe, wird Ihre Benutzeroberfläche nicht mit Werten aktualisiert, was auch immer Sie in ViewModel hinzufügen, aber wenn Sie in der Benutzeroberfläche einen Wert hinzufügen, spiegelt sich dies im ViewModel wider.
Wenn dies der Fall ist, verwenden Sie ObserableCollection anstelle von list , und wenn Sie jedes Mal eine Liste erstellen, müssen Sie INotifyPropertyChanged in Ihrem Ansichtsmodell implementieren.
Wenn Sie dies alles getan haben, es aber immer noch nicht aktualisiert wird, erstellen Sie die Liste in einer Aufgabe, die kein UI-Thread ist.Wenn Sie eine Benutzeroberfläche von einem Nicht-UI-Thread aktualisieren möchten, verwenden Sie update the UI using Dispatcher .Sie finden viele Beispiele zum Aktualisieren der Benutzeroberfläche aus einem Nicht-UI-Thread mithilfe des Dispatchers