首页 > 解决方案 > 使用 Xamarin MVVM Prism 通过 Searchbar 中的 TextChanged 事件更新 ListView

问题描述

我在 Xamarin Forms 中使用 MVVM Prism。我正在访问 API 以获取记录,并将其分配给 ObservableCollections。

我试图弄清楚如何在我的 SearchBar 上使用我的 TextChanged EventToCommandBehavior。事件触发器正在工作,我要修复的是在键入时自动更新我的 ListView。我可以在使用后面的代码时做到这一点,但现在我想使用 MVVM Prism 方法并将我的所有代码放在我的视图模型中。

我还尝试在我的 ViewModel 中创建 ListView 并将我的 ObservableCollection 传递给它,以便我可以在我的视图中将它用作可绑定对象,但它也不起作用,或者我做错了。

查看模型

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

看法

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

接口和模型

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

截屏

标签: c#xamlxamarin.formsmvvmprism

解决方案


我已经找到了最好的解决方法。我安装了 NuGet 包 PropertyChanged.Fody,它解决了我的所有问题。我根本不需要编写 SetProperty 也不需要实现 INotifyPropertyChanged。我还创建了一个将由我的搜索事件使用的列表。谢谢你们。


推荐阅读