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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top