c# xaml windows-phone-8 collectionviewsource

c# - Windows Phone CollectionViewSort no muestra nada



xaml windows-phone-8 (1)

El problema es que el control LongListSelector requiere que su ItemsSource implemente IList , lo que CollectionViewSource no hace. Esto significa que no puede vincular un CollectionViewSource a un LongListSelector fuera de la caja. Puede ver esto tratando de establecerlo en el archivo de código subyacente de esta manera:

myLongListSelector.ItemsSource = myCollectionViewSource.View;

Lo que da un error al decir que no puede convertir la vista a IList .

Sé que al menos hay dos soluciones para esto, una es escribir una clase contenedora alrededor de CollectionViewSource que implementa IList y luego se une a eso. Otra pregunta da un ejemplo de esto (no lo he pensado): Agrupación LongListSelector utilizando CollectionView en Windows Phone 7 o Windows Phone 8

Otro método es no usar CollectionViewSource y, en su lugar, usar System.Linq para ordenar como se sugiere en esta pregunta: Cómo ordenar un LongListSelector en Windows Phone

Estoy intentando desarrollar una página en una aplicación WP8 que tiene un cuadro de búsqueda en la parte superior y una lista de elementos que coinciden con la búsqueda a continuación, actualizando a medida que se actualiza el cuadro de búsqueda. Bastante sencillo, ¿verdad? Excepto que no puedo hacer que funcione.

Después de leer detenidamente StackOverflow y el interwebz, la solución recomendada parece ser el uso de CollectionViewSource . Bueno, estoy tratando de usarlo y no aparecen artículos. Tan pronto como cambio a ObservableCollection contiene mis elementos en XAML, todo se muestra bien.

Mis datos se cargan de forma asincrónica desde un DB.

XAML

<Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <toolkit:PhoneTextBox Grid.Row="0" Hint="search query" ActionIcon="/Assets/Search.png" Text="{Binding SearchQuery, Mode=TwoWay}"> <i:Interaction.Behaviors> <themes:TextBoxUpdateOnTextChangedBehavior /> </i:Interaction.Behaviors> </toolkit:PhoneTextBox> <phone:LongListSelector Grid.Row="1" ItemsSource="{Binding SearchResults}" /> <!-- I have also tried binding to SearchResults.View with no success --> </Grid>

Ver modelo

public class MyViewModel { private ObservableCollection<MyItemViewModel> _allItems = new ObservableCollection<MyItemViewModel>(); public CollectionViewSource SearchResults { get; private set; } public MyViewModel() { SearchResults = new CollectionViewSource { Source = _allItems }; _allItems.CollectionChanged += (_, __) => SearchResults.View.Refresh(); LoadAllItemsAsync(); } private async void LoadAllItemsAsync() { IList<MyItemModel> models = await LoadMyModels(); _allItems.AddRange(models.Select(model => new MyItemViewModel(model))); } }

Como puede ver, aún no he intentado escribir el código de filtrado. ¿No debería el código anterior mostrar básicamente un LongListSelector con todos los artículos que he cargado? Si cambio los resultados de SearchResults a ObservableCollection<MyItemViewModel> y ObservableCollection<MyItemViewModel> que getter devuelva _allItems , mi página muestra los elementos esperados. ¿Qué estoy haciendo mal aquí?