2014-03-01 1 views
2

상단에 검색 창이 있고 아래 검색과 일치하는 항목 목록이있는 WP8 앱에서 검색 상자 업데이트로 업데이트하는 페이지를 개발하려고합니다. 아주 똑바로, 맞습니까? 나는 그것을 작동시킬 수 없다는 점을 제외하고는.Windows Phone CollectionView 아무것도 표시하지 않음

StackOverflow와 interweb를 살펴본 후 CollectionViewSource을 사용하는 것이 좋습니다. 글쎄, 나는 그것을 사용하려고하고 아무 항목도 나타나지 않는다. XAML에서 내 항목이 포함 된 ObservableCollection으로 전환하면 모든 항목이 정상적으로 표시됩니다.

내 데이터가 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> 

보기 모델

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))); 
    } 
} 

, 나는 아직 코드를 필터링 쓰기를 시도하지 않았습니다. 위의 코드는 기본적으로 내가로드 한 모든 항목이있는 LongListSelector를 보여 주면 안됩니까? SearchResults 유형을 ObservableCollection<MyItemViewModel>으로 변경하고 getter가 _allItems을 반환하면 내 페이지에 예상되는 항목이 표시됩니다. 여기서 내가 뭘 잘못하고 있니?

답변

4

컨트롤에 LongListSelector 컨트롤의 ItemsSource은 CollectionViewSource가 수행하지 않는 IList을 구현해야합니다. 즉, 을 LongListSelector에 바인딩 할 수 없습니다. 이 같은 코드 숨김 파일에 설정하려고하여 볼 수 있습니다 : 그것은 IList에보기를 변환 할 수 없다는 오류를 제공

myLongListSelector.ItemsSource = myCollectionViewSource.View; 

합니다.

나는 이것에 적어도 두 가지 해결책을 알고있다. 하나는 IList를 구현 한 CollectionViewSource 주위에 래퍼 클래스를 작성한 다음 바인딩하는 것이다. LongListSelector grouping using CollectionView in Windows Phone 7 or Windows Phone 8

또 다른 방법은 같은이 질문에 제안 정렬에 사용 CollectionViewSource 대신 System.Linq를 사용하지 않는 것입니다 : How to Sort a LongListSelector in Windows Phone

+0

허 또 다른 질문은 이것의 예를 (내가 생각 시도하지 않은) 제공합니다. 나는 그것에 대해 전혀 몰랐다. 그 다른 수정 중 하나를 시도하자. 또는 ItemsControl을 사용하십시오. – sohum