23 messaggi dal 09 marzo 2009
salve,
al momento del caricamento della pagina salvo in un ObservableDictionary defaultViewModel un IEnumerable<T>.
In seguito richiamandolo con
var Notizie = this.DefaultViewModel["Notizie"];

ottengo un System.Collections.ObjectModel.ObservableCollection<T> è possibile ritornare ad IEnumerable<T>?

grazie 1000
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


salvo in un ObservableDictionary
...
ottengo un ObservableCollection<T>

Qual è dei due il tipo restituito da this.DefaultViewModel["Notizie"]?
  • Se è un'ObservableCollection<T> non devi fare nulla, perché già implementa IEnumerable<T> e quindi puoi usarlo tale e quale in tutti i punti (assegnazioni di proprietà o passaggio come argomento a metodi) che richiedono l'uso di un IEnumerable<T>. Non è necessaria alcuna conversione tra tipi.
  • Se è un ObservableDictionary<TKey, TValue>, anche in questo caso puoi usarlo tale e quale, consapevole che l'interfaccia in questione sarà IEnumerable<KeyValuePair<TKey, TValue>>. Se ti servisse lavorare solo con i valori, puoi usare la proprietà Values dell'ObservableDictionary che ti restituisce un oggetto che è un IEnumerable<TValue>


ciao,
Moreno
Modificato da BrightSoul il 11 luglio 2016 22.12 -

Enjoy learning and just keep making
23 messaggi dal 09 marzo 2009
con DefaultViewModel["Notizie"] si ottiene un object{System.Collections.ObjectModel.ObservableCollection<T>},
e forse nn è la strada giusta, dato che vorrei poter ottenere Notizie come IEnumerable<T> come lo era quando è stato assegnato ad un ObservableDictionary.
Come posso ottenere questo?
grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
come ti dicevo, un ObservableCollection<T> è già un IEnumerable<T> simile a quello originale.
Guarda questo esempio in cui passo l'Observable ad un metodo che accetta un IEnumerable.
https://dotnetfiddle.net/ww5nRA

Se per una tua ragione vuoi lavorare con una variabile di tipo IEnumerable, puoi fare un'assegnazione del genere, ma non sarebbe necessario.
IEnumerable<Notizia> notizie =  DefaultViewModel["Notizie"];


Se questo non risolve il problema, allora forse c'è qualcos'altro che non sono riuscito a carpire dalla questione.
Forse la tua ObservableCollection viene modificata (elementi aggiunti, rimossi o riordinati) e tu vuoi riottenere l'elenco immacolato come era all'inizio? Solo in questo caso dovresti esporre nel ViewModel anche l'IEnumerable stesso, oppure sottoforma di ReadOnlyCollection.

ciao,
Moreno
Modificato da BrightSoul il 13 luglio 2016 07.55 -

Enjoy learning and just keep making
23 messaggi dal 09 marzo 2009
ti ringrazio per le tue risposte e esempio,
ben chiaro che ObservableCollection<T> può essere trattato come IEnumerable<T>,
il problema è che DefaultViewModel["Notizie"] ritorna un oggetto di ObservableCollection... infatti scrivendo:

IEnumerable<SampleDataNotizie> notizie = DefaultViewModel["Notizie"];

Mi dà l'errore che non si può convertire un Object a
System.Collection.Generic.IEnumerable<SampleDataNotizie>... probabilmente mi manca un cast.

La situazione è questa: mi ritrovo in una pagina con le notizie che vengono inserite la prima volta in un ObservableCollection e visualizzate. L'utente può cliccare su sincronizza (è viene scaricato e visualizzato le nuove possibili notizie), da tale sincronizzazione mi ritorna un IEnumerable, NotizieNew, a questo punto vorrei riprendere le vecchie notizie, che mi riprovo in DefaultViewModel["Notizie"], (averlo come IEnumerable) e fare una Concat tra IEnumerable e salvarle in joson .... in modo che possa da ora in avanti averle tutte e aggiornate all'ultima sincronizzazione.

Per adesso ho risolto prendendo l'oggetto DefaultViewModel["Notizie"] e inserendo con un foreach i suoi elementi in una List<sampleDataNotizie> per poter fare dopo il Concat... ma questa soluzione nn mi piace, ecco perchè chiedevo questa conversione.
grazie per la tua pazienza.. ma ancora di strada ne devo fare!!!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


il problema è che DefaultViewModel["Notizie"] ritorna un oggetto di ObservableCollection...

Ah ok, chiaro, quindi il tipo restituito dall'indexer di DefaultViewModel non è un ObservableCollection, ma un object.

Quindi ora il problema si spiega: dato che object è il tipo base di molti altri tipi, non è detto che un'istanza contenuta in un riferimento ad object sia necessariamente un IEnumerable. Per questo è necessario un casting esplicito.

Quindi ti basta fare:
IEnumerable<Notizia> notizie =  DefaultViewModel["Notizie"] as IEnumerable<Notizia>;


ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.