2017-06-29 4 views
0

MVVMを使用してXamarin検索ページを作成したいとします。私はMainWindowViewModelでロジックを作成しました。ロジックは、ユーザーがsearcharに文字を入力するとListViewを更新する必要があります。しかし、私はそのような結果を持っています:In some reason UI is not updatingMVVM検索ページの作成Xamarin

私は何が間違っていたのか分かりません。 また、私はExecutionSearchCommandを非同期的に呼び出すことができます。正しく実装する方法を示すなら、私は訴えるでしょう。おかげさまで

<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> 

これはExecuteSearchCommandに表示

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

答えて

0

にラインMyList = new ObservableCollectionを結合し、私のViewModelにあるがno-noです。あなたのリストビューは古いObservableCollectionにバインドされています。新しいビュービューを作成すると、そのバインディングが破られ、新しいビューについて何も知らないためビューが更新されません。

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

リストビューがバインドされているコレクションを更新しているその方法を、とリストビューは以下となります。あなたは、観察可能なコレクションの内容を変更する必要があります(擬似コードで)このようにそれを行う

変更を参照してください。

関連する問題