【问题标题】:SearchBar in ObserwableCollection and List MVVMObservableCollection 中的搜索栏并列出 MVVM
【发布时间】:2020-10-01 07:59:23
【问题描述】:

我有 SearchBar,它可以从 List 中实时搜索信息。但是我有一个问题。例如,当我在字段中写入文本时,会显示新文本,但是当我删除部分文本时,它不会更新到之前的状态。那就是如果我有列表:

BAC

BAE

北汽

贝利

巴贾杰

贝克

电动

鲍德温运动

投票

当我写例如白或白时,我的清单显示给我

北汽

贝利 但是当擦除字母(现在是 ba)时,它必须显示 BAC

BAE

北汽

贝利

巴贾杰

贝克

但它仍然是 北汽

贝利

请帮忙

Xaml 代码

 <Frame CornerRadius="15" HasShadow="True" BorderColor="LightGray" Margin="0,10,0,0" Padding="5">
                    <controls:CustomSearchBar x:Name="searchBar"  
            TextColor="Gray" 
                 >
                    <!---->    <corcav:Interaction.Behaviors>
                            <corcav:BehaviorCollection>
                                <corcav:EventToCommand EventName="TextChanged" Command="{Binding Path=SearchBarTextChangedCommand}" PassEventArgument="True"/>
                            </corcav:BehaviorCollection>
                        </corcav:Interaction.Behaviors>
                    </controls:CustomSearchBar>
                </Frame>
   <ListView x:Name="Company"   SelectionMode="None" ItemsSource="{Binding SearchedCars}">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <ViewCell>
                                <Grid >
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="46" />

                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto" />
                                    </Grid.ColumnDefinitions>
                                    <StackLayout>
                                        <controls:ExtendedButton2   HeightRequest="45" Padding="5,10,0,10"
                             WidthRequest="300"   Margin="0"  HorizontalTextAlignment="Start"
                         BackgroundColor="{Binding CustButtonColor}" Text="{Binding Name}" TextColor="Gray" FontSize="18" 
                                           Command="{ Binding BindingContext.ChangeMark, 
                                            Source={x:Reference Name=Company} }"  CommandParameter="{Binding .}"/>

                                        <BoxView   Margin="0,-6,0,0" 
            HeightRequest="1" 
            BackgroundColor="LightGray" 
            HorizontalOptions="FillAndExpand"  VerticalOptions="End"/>
                                    </StackLayout>
                                    
                                </Grid>
                                </ViewCell>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>

视图模型

 class CarAddCompany : INotifyPropertyChanged
    {
        private List<Car> Cars = new List<Car>();

        public List<Car> SearchedCars { get => Cars; set { Cars = value; OnPropertyChanged("SearchedCars"); } }
        public ICommand ChangeMark { protected set; get; }
        public MainCar mainCar { get; set; }
        INavigation Navigation { get; set; }

        public Command navigateCommand { get; set; }

        public Command navigateCommandBACK { get; set; }
        public ICommand SearchBarTextChangedCommand { get; set; }
        public async Task GotoPage2()
        {
            if (mainCar.MarkCar != null) await Navigation.PushModalAsync(new Car_add_model(mainCar));
        }
        public async Task GotoPage1()
        {
            //mainCar.MarkCar ="";
            //   await Navigation.PushModalAsync(new Car_add());
            await Navigation.PopModalAsync();
        }
        private void OnSearchBarTextChanged(object obj)
        {
            if (obj is TextChangedEventArgs args)
            {
                string filter = args.NewTextValue;
                SearchedCars = Cars.Where(x => x.Name.ToLower().Contains(filter.Trim().ToLower())).ToList();
            }
        }
        public CarAddCompany(INavigation navigation,MainCar carC)
        {
            mainCar = carC;

            this.Navigation = navigation;
            this.navigateCommand = new Command(async () => await GotoPage2());
            navigateCommandBACK = new Command(async () => await GotoPage1());
            SearchBarTextChangedCommand = new Command<object>(OnSearchBarTextChanged);
            Cars = new List<Car>();
          Cars.Add(new Car() { Name = "BAC", CustButtonColor = Color.White });
        Cars.Add(new Car() { Name = "BAE", CustButtonColor = Color.White });
        Cars.Add(new Car() { Name = "BAIC",  CustButtonColor = Color.White });
        Cars.Add(new Car() { Name = "Bailey",  CustButtonColor = Color.White });
        Cars.Add(new Car() { Name = "Bajaj",  CustButtonColor = Color.White });
        Cars.Add(new Car() { Name = "Baker", CustButtonColor = Color.White });
        Cars.Add(new Car() { Name = "Electric", CustButtonColor = Color.White });
        Cars.Add(new Car() { Name = "Baldwin-Motion",CustButtonColor = Color.White });
        Cars.Add(new Car() { Name = "Ballot",  CustButtonColor = Color.White });

         

                foreach (var item in Cars)
                {

                    item.CustButtonColor = Color.White;
                }
                    
                    var car = key as Car;
                    car.CustButtonColor = Color.FromHex("#D1DAED");
                    mainCar.MarkCar = car.Name;

                
            });
        }
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

我希望当我删除一个单词时,我会用 Ba 显示上一个列表。取决于搜索栏中的文本

【问题讨论】:

  • 擦除字符时 OnSearchBarTextChanged 会触发吗?

标签: c# xaml xamarin xamarin.forms xamarin.android


【解决方案1】:

更新此方法并调试此方法

private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
        {
            string filter = e.NewTextValue;
            if (!string.IsNullOrEmpty(filter))
            {
                var filterList = cars.Where(x => x.Name.ToLower().Contains(filter.Trim().ToLower())).ToList();
                SearchedCars = new ObservableCollection<Car>(filterList);
            }
            else
                SearchedCars = new ObservableCollection<Car>(cars);
        }

【讨论】:

  • 如何在MVVM中编写?
  • private void OnSearchBarTextChanged(object obj) { if (obj is TextChangedEventArgs args) { string filter = args.NewTextValue; SearchedCars = Cars.Where(x => x.Name.ToLower().Contains(filter.Trim().ToLower())).ToList(); } }
  • 这是你的最后一个功能
  • @MariaKamenskyh 我知道我没有遇到这个问题。要么制作一个我可以查看的 git repo
【解决方案2】:

您将 Cars 和 SearchCars 等同起来,这是两个独立的集合

using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Input;
using Xamarin.Forms;
namespace App1
{
    class CarAddCompany : INotifyPropertyChanged
    {
        private List<Car> Cars = new List<Car>();

        private List<Car> searchedCars = new List<Car>();
        public List<Car> SearchedCars { get => searchedCars; set { searchedCars = value; OnPropertyChanged("SearchedCars"); } }

        public ICommand ChangeMark { protected set; get; }

        private INavigation navigation;

        private INavigation GetNavigation()
        {
            return navigation;
        }

        private void SetNavigation(INavigation value)
        {
            navigation = value;
        }

        public ICommand SearchBarTextChangedCommand { get; set; }

        private void OnSearchBarTextChanged(object obj)
        {
            if (obj is TextChangedEventArgs args)
            {
                string filter = args.NewTextValue;
                SearchedCars = Cars.Where(x => x.Name.ToLower().Contains(filter.Trim().ToLower())).ToList();
            }
        }
        public CarAddCompany(INavigation navigation)
        {
            this.SetNavigation(navigation);

            SearchBarTextChangedCommand = new Command<object>(OnSearchBarTextChanged);
            Cars = new List<Car>();
            Cars.Add(new Car() { Name = "Ford", CustButtonColor = Color.White });
            Cars.Add(new Car() { Name = "Toyota", CustButtonColor = Color.White });
            Cars.Add(new Car() { Name = "Honda", CustButtonColor = Color.White });
            Cars.Add(new Car() { Name = "Tesla", CustButtonColor = Color.White });
            Cars.Add(new Car() { Name = "Chevrolet", CustButtonColor = Color.White });
            Cars.Add(new Car() { Name = "BMW", CustButtonColor = Color.White });
            Cars.Add(new Car() { Name = "Audi", CustButtonColor = Color.White });
            Cars.Add(new Car() { Name = "Mercedes", CustButtonColor = Color.White });
            Cars.Add(new Car() { Name = "Lexus", CustButtonColor = Color.White });

            SearchedCars = new List<Car>(Cars);
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2014-06-26
    • 2018-01-23
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多