2017-06-29 12 views
0

Ich möchte eine Xamarin-Suchseite mit MVVM erstellen. Ich habe eine Logik in meinem MainWindowViewModel erstellt, die meine ListView aktualisieren muss, sobald der Benutzer ein Zeichen in den Sucher eingegeben hat. Aber ich habe ein solches Ergebnis: In some reason UI is not updatingErstellen einer MVVM-Suchseite Xamarin

Ich weiß nicht, was ich falsch gemacht habe. Und ich möchte auch ExecuteSearchCommand asynchron aufrufen, und ich werde approsiate, wenn Sie zeigen, wie Sie es richtig implementieren. Danke.

<ContentPage.BindingContext> 
    <ViewModels:MainWindowViewModel/> 
    </ContentPage.BindingContext> 

<ContentPage.Content> 
    <StackLayout> 

     <SearchBar SearchCommand="{Binding SearchCommand}" 
        Text="{Binding EnteredText}" 
        /> 
     <Label Text="{Binding EnteredText}"></Label> 
     <ListView x:Name="lstContatos" ItemsSource="{Binding MyList}" HasUnevenRows="True"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <ViewCell> 
         <StackLayout> 
          <Grid MinimumHeightRequest="80" HeightRequest="120" HorizontalOptions="FillAndExpand" > 
           <Grid.RowDefinitions> 
            <RowDefinition/> 
            <RowDefinition/> 
           </Grid.RowDefinitions> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition/> 
            <ColumnDefinition/> 
           </Grid.ColumnDefinitions> 

           <Label Grid.Row="0" Text="{Binding PhrasalVerb}"/> 
           <Button Text="Delete" Grid.Column="1" BackgroundColor="Black" HeightRequest="30" WidthRequest="40" IsVisible="True"/> 

          </Grid> 
         </StackLayout> 
        </ViewCell> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </StackLayout> 
</ContentPage.Content> 

Das ist mein Ansichtsmodell, das

 public string EnteredText 
     { 
     get { return enteredText; } 
     set 
     { 
      enteredText = value; 
      this.SearchCommand.Execute(null); 
      OnPropertyChanged(nameof(EnteredText)); 
     } 
    } 


    void ExecuteSearchCommand(object parameter) 
    { 
     if (enteredText.Length>=1) 
     { 
      MyList = new ObservableCollection<PhV_Get>(phrasalVerbGet 
       .Where(x => x.PhrasalVerb.ToLower() 
       .Contains(enteredText.ToLower())).ToList()); 
     } 
     else 
     { 
      MyList = phrasalVerbGet; 
     } 

    } 

    public ObservableCollection<PhV_Get> MyList 
    { 
     set 
     { 
      phrasalVerbGet = value; 
      OnPropertyChanged(nameof(MyList)); 
     } 
     get 
     { 
      return phrasalVerbGet; 
     } 
    } 

    public Command SearchCommand { 
     get 
     { 
      return new Command(ExecuteSearchCommand, 
      CanExecuteSeachCommand); 
     } 
    } 

    public bool CanExecuteSeachCommand(object parameter) 
    { 
     return true; 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     this.PropertyChanged?.Invoke(this, new 
        PropertyChangedEventArgs(propertyName)); 
    } 

Antwort

0

Die Linie MyList = new ObservableCollection in ExecuteSearchCommand an die View bindet, ist ein No-No. Ihre Listenansicht ist an die alte ObservableCollection gebunden - wenn Sie eine neue erstellen, brechen Sie diese Bindung und die Ansicht wird nicht aktualisiert, da sie nichts über die neue weiß.

Wenn Sie den Inhalt eines beobachtbaren Sammlung ändern müssen, tun Sie es wie folgt aus (in Pseudo-Code):

MyList.Clear(); 
foreach (thing in myListOfThings) 
{ 
    MyList.Items.Add(thing); 
} 

diese Weise können Sie die Sammlung aktualisieren, die die Listview gebunden ist, und die Listview wird Siehe die Änderungen.

Verwandte Themen