Вопрос

Итак, я пытаюсь переместить настольную программу, которую я создал, в приложение для 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top