Привязка данных ListView для приложений магазина Windows 8.1
-
20-12-2019 - |
Вопрос
Итак, я пытаюсь переместить настольную программу, которую я создал, в приложение для Windows 8.1
с помощью Visual Studio 2013
. Datagrid
было признано устаревшим для этого выпуска, поэтому я пытаюсь перевести их в ListView
.Ранее я использовал ListViews
в других настольных приложениях, но, похоже, многое изменилось.Проблема, с которой я сталкиваюсь, заключается в заполнении моего ListView
из моей базы данных.Я подключаюсь через WCF Service
и, просматривая код, я вижу, что получаю правильные данные, я просто не могу заставить их отображаться в моем ListView.Моим предпочтительным конечным результатом был бы "listview" с 3 столбцами информации, которые будут доступны для редактирования.Раньше я бы использовал ListView.View
а затем поставьте GridView
там, внутри, для колонок.Но это кажется ListView.View
является устаревшим точно так же, как GridView.Columns
.
вот мой xaml для 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>
В моем коде я присваиваю itemssource моего listview.
VMInventory inventory = new VMInventory();
inventory.GetList();
lvInventory.ItemsSource = inventory;
VMInventory
это мой ViewModel
где я получаю свои данные из WCF service
и это выглядит как:
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);
}
Последнее замечание, я смог добавить текстовое поле в Grid
и когда я DataBind
это к text="{Binding Current.InventoryName}"
Я могу успешно связать его.
Решение
Если я правильно понимаю, ваш пользовательский интерфейс не обновляется значениями, которые вы когда-либо добавляли в ViewModel, но если вы добавляете какое-либо значение в пользовательский интерфейс, это отражается в ViewModel.
Если это так, то используйте ObserableCollection вместо list, и если вы создаете список каждый раз, то вам нужно реализовать INotifyPropertyChanged в вашей ViewModel.
Если вы сделали все это, но он по-прежнему не обновляется, то вы создаете список в asy Task, который не является потоком пользовательского интерфейса.Если вы хотите обновить пользовательский интерфейс из потока, отличного от пользовательского интерфейса, используйте update the UI using Dispatcher.Вы можете найти множество примеров обновления пользовательского интерфейса из потока, отличного от пользовательского интерфейса, с помощью dispatcher