简体   繁体   English

使用 Xamarin MVVM Prism 通过 Searchbar 中的 TextChanged 事件更新 ListView

[英]Update ListView by TextChanged Event in Searchbar using Xamarin MVVM Prism

I'm using MVVM Prism in Xamarin Forms. I'm accessing an API to GET records and I'm assigning it to an ObservableCollections.我在 Xamarin Forms 中使用 MVVM Prism。我正在访问 API 以获取记录并将其分配给 ObservableCollections。

I'm trying to figure out how to work my TextChanged EventToCommandBehavior on my SearchBar.我想弄清楚如何在我的 SearchBar 上使用我的 TextChanged EventToCommandBehavior。 The event trigger is working, what I'm trying to fix is the automatic update of my ListView while typing.事件触发器正在工作,我要修复的是在键入时自动更新我的 ListView。 I can do this when using the code behind, but now I want to use the MVVM Prism approach and put all my codes in my View Model.我可以在使用后面的代码时这样做,但现在我想使用 MVVM Prism 方法并将我的所有代码放在我的视图 Model 中。

I also tried creating ListView in my ViewModel and pass my ObservableCollection to it so I can use it as bindable object in my View but it is also not working, or maybe I am doing it wrong.我还尝试在我的 ViewModel 中创建 ListView 并将我的 ObservableCollection 传递给它,这样我就可以在我的视图中将它用作可绑定的 object 但它也不起作用,或者我做错了。

VIEW MODEL查看 MODEL

 public class CoinsPageViewModel : BindableBase
        {
            public ObservableCollection<CoinsModel> coinsModel { get; set; }
            private ICoins _icoins;
            public INavigationService NavigationService { get; set; }

            private DelegateCommand<string> _textChangedCommand { get; set; }
            public DelegateCommand<string> TextChangedCommand => 
                _textChangedCommand ?? (_textChangedCommand = new DelegateCommand<string>(TextChanged));
    
            private async void TextChanged(string obj)
            {
                var coins = await _icoins.GetCoinsList();
                var keyword = _searchText;
                var searchResult = coinsModel.Where(c => c.Name.ToLower().Contains(keyword.ToLower()));
                
                //----DISPLAY SEARCH RESULT TO THE BINDABLE OBJECT IN VIEW----
            }
    
            public CoinsPageViewModel(ICoins coins, INavigationService navigationService)
            {
                coinsModel = new ObservableCollection<CoinsModel>();
                _icoins = coins;
                LoadCoins();
                NavigationService = navigationService;
            }
    
            private string _searchText;
            public string SearchText
            {
                get { return _searchText; }
                set { SetProperty(ref _searchText, value); }
            }
    
            public async void LoadCoins()
            {
                var coins = await _icoins.GetCoinsList();
                foreach (var coin in coins)
                {
                    coinsModel.Add(coin);
                }
            }
    
            private CoinsModel _selectedCoin;
            public CoinsModel SelectedCoin
            {
                get { return _selectedCoin; }
                set 
                { 
                    _selectedCoin = value;
                    if (_selectedCoin != null)
                    {
                        var navigationParamaters = new NavigationParameters();
                        navigationParamaters.Add("coinsid", _selectedCoin.Id);
                        NavigationService.NavigateAsync("CoinsDetailsPage", navigationParamaters);
                    }
                }
            }
    
        }

VIEW看法

 <ContentPage.Content>
            <Grid>
                <StackLayout>
                    <SearchBar TextColor="White" 
                               Text="{Binding SearchText}"
                               BackgroundColor="#6b120a" 
                               Placeholder="Search" 
                               PlaceholderColor="White" 
                               CancelButtonColor="White">
                        <SearchBar.Behaviors>
                            <prism:EventToCommandBehavior EventName="TextChanged"
                                                          Command="{Binding TextChangedCommand}"
                                                          CommandParameter="Text">
                            </prism:EventToCommandBehavior>
                        </SearchBar.Behaviors>
                    </SearchBar>
    
                    <ListView SeparatorColor="#d96818" 
                              x:Name="LvCoins"
                              ItemsSource="{Binding coinsModel}"
                              SelectedItem="{Binding SelectedCoin}"
                              Margin="5"                         
                              HasUnevenRows="True" 
                              androidSpecific:ListView.IsFastScrollEnabled="True">
                              
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <ViewCell>
                                    <Grid HorizontalOptions="Fill">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="auto"/>
                                            <ColumnDefinition Width="auto"/>
                                        </Grid.ColumnDefinitions>
    
                                        <StackLayout Margin="5,5,0,0">
                                            <Label Text="{Binding Name}" 
                                                   VerticalOptions="Center" 
                                                   FontSize="15" TextColor="Black" 
                                                   FontFamily="Chunkfive"/>
                                            <Label Text="{Binding Symbol}" 
                                                   VerticalOptions="Center" 
                                                   FontSize="15" TextColor="#6b120a" 
                                                   FontAttributes="Bold"/>
                                        </StackLayout>
                                    </Grid>
                                </ViewCell>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </StackLayout>
            </Grid>
        </ContentPage.Content>

INTERFACE and MODEL接口和MODEL

   public interface ICoins
        {
            Task<List<CoinsModel>> GetCoinsList();
            Task<CoinsDetailModel> GetCoinsDetails(string id);
        }

public class CoinsModel
        {
            [JsonProperty("id")]
            public string Id { get; set; }
            [JsonProperty("symbol")]
            public string Symbol { get; set; }
            [JsonProperty("name")]
            public string Name { get; set; }
            public string NameSort => Name[0].ToString();
        }
    

SCREENSHOT截屏

I already found the best fix for this.我已经找到了最好的解决方法。 I installed the NuGet package PropertyChanged.Fody and it fixed all my issues.我安装了 NuGet package PropertyChanged.Fody,它解决了我所有的问题。 I don't need to write SetProperty nor Implement the INotifyPropertyChanged at all.我根本不需要编写 SetProperty 或实现 INotifyPropertyChanged。 I also create a List which will be used by my Search event.我还创建了一个将由我的搜索事件使用的列表。 Thank you all.谢谢你们。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM