首页 > 解决方案 > 使用 tableview 作为可搜索的输入

问题描述

我有这个可搜索的表格视图。此时我可以填写它并在搜索时转到详细视图。知道我想将其转换为将其用作输入吗?但如何?我有一个输入视图,从技术上讲,我有一个返回值的 tableview,只是方式不正确。

表视图模型:

   public class CMCTableViewModel : MvxViewModel
    {
        protected readonly ICoinMarketCapService _coinMarketCapService;
        public CMCTableViewModel(ICoinMarketCapService coinMarketCapService)
        {
            _coinMarketCapService = coinMarketCapService;
            LoadData();
        }
        public MvxCommand<CoinMarketCapModel> NavigateToDetailCommand
        {
            get
            {
                return new MvxCommand<CoinMarketCapModel>(
                    SelectedCoin =>
                    {
                        ShowViewModel<CoinViewModel>(new { coinName = SelectedCoin.Id });
                    }
                  );
            }
        }

        private List<CoinMarketCapModel> _coinMarketCapModelList;
        private CoinMarketGlobData _CoinMarketGlobDataList;
        public List<CoinMarketCapModel> CoinMarketCapModelList
        {
            get
            {

                return _coinMarketCapModelList;
            }
            set
            {
                _coinMarketCapModelList = value;
                RaisePropertyChanged(() => CoinMarketCapModelList);
            }
        }
        public CoinMarketGlobData CoinMarketGlobDatas
        {
            get
            {
                return _CoinMarketGlobDataList;
            }
            set
            {
                _CoinMarketGlobDataList = value;
                RaisePropertyChanged(() => CoinMarketGlobDatas);
            }
        }

        public async void LoadData()
        {

            //CoinMarketCapModelList = await _coinMarketCapService.GetCoins("20");


            //CoinMarketGlobDatas = await _coinMarketCapService.GetGlobalData();
            CoinMarketCapModelList = await _coinMarketCapService.GetCoins();

            FilteredList = CoinMarketCapModelList;
        }

        private List<CoinMarketCapModel> _FilteredList;
        public List<CoinMarketCapModel> FilteredList
        {
            get
            {
                return _FilteredList;
            }
            set
            {
                _FilteredList = value;
                RaisePropertyChanged(() => FilteredList);
            }
        }

        public void SearchByText(string text)
        {
            if (string.IsNullOrWhiteSpace(text))
                FilteredList = CoinMarketCapModelList;
            else
            {
                FilteredList = CoinMarketCapModelList;
                FilteredList = FilteredList.Where(m => m.Name.ToLowerInvariant().Contains(text.ToLowerInvariant())).ToList();
            }
        }

    /// <summary>
    /// Gets or sets the subtitle for the base model
    /// </summary>
    }

看法:

[MvxFromStoryboard(StoryboardName = "Main")]
public partial class CMCTableView : MvxTableViewController<CMCTableViewModel>
{
    bool useRefreshControl = false;
    //private UIRefreshControl refreshControl;
    private MvxUIRefreshControl refreshControl;
    private void refreshTable(object sender, EventArgs e)
    {
        refreshControl.EndRefreshing();
        TableView.ReloadData();
    }
    public CMCTableView (IntPtr handle) : base (handle)
    {
    }

    UISearchBar _searchBar;
    CMCTableViewSource _cmcTableViewSource;

    public override void ViewDidLoad()
    {
        refreshControl = new MvxUIRefreshControl();
        refreshControl.ValueChanged += refreshTable;
        TableView.AddSubview(refreshControl);

        _cmcTableViewSource = new CMCTableViewSource(this.TableView);
        base.ViewDidLoad();

        this.TableView.Source = _cmcTableViewSource;
        this.TableView.ReloadData();

        //BEGIN initialize searchbar 

        var searchController = new UISearchController(searchResultsController: null);

        searchController.SearchBar.SizeToFit();
        searchController.SearchBar.SearchBarStyle = UISearchBarStyle.Minimal;
        searchController.SearchBar.Placeholder = "Select a currency";
        searchController.DimsBackgroundDuringPresentation = false;

        NavigationItem.HidesSearchBarWhenScrolling = false;
        NavigationItem.SearchController = searchController;

        _searchBar = searchController.SearchBar;
        _searchBar.SearchButtonClicked += SearchBar_SearchButtonClicked;
        _searchBar.TextChanged += SearchBarOnTextChanged;
        _searchBar.CancelButtonClicked += SearchBarOnCancelButtonClicked;

        // END initialize searchbar


        MvxFluentBindingDescriptionSet<CMCTableView, CMCTableViewModel> set = new MvxFluentBindingDescriptionSet<CMCTableView, CMCTableViewModel>(this);

        set.Bind(_cmcTableViewSource).To(vm => vm.FilteredList);



        set.Bind(_cmcTableViewSource)
            .For(src => src.SelectionChangedCommand)
            .To(vm => vm.NavigateToDetailCommand);

        set.Apply();

    }

    private void SearchBarOnCancelButtonClicked(object sender, EventArgs eventArgs)
    {
        ((CMCTableViewModel)ViewModel).SearchByText(string.Empty);
        BeginInvokeOnMainThread(() => _searchBar.ResignFirstResponder());
    }
    //public override void ViewWillAppear(bool animated)
    //{
    //    base.ViewWillAppear(animated);
    //    NavigationController.NavigationBarHidden = false;
    //}

    private void SearchBarOnTextChanged(object sender, UISearchBarTextChangedEventArgs e)
    {
        if (string.IsNullOrWhiteSpace(_searchBar.Text))
        {
            ((CMCTableViewModel)ViewModel).SearchByText(string.Empty);

            BeginInvokeOnMainThread(() => _searchBar.ResignFirstResponder());
        }
        else
        {
            ((CMCTableViewModel)ViewModel).SearchByText(_searchBar.Text);
        }
    }

    private void SearchBar_SearchButtonClicked(object sender, EventArgs e)
    {
        ((CMCTableViewModel)ViewModel).SearchByText(_searchBar.Text);
        BeginInvokeOnMainThread(() => _searchBar.ResignFirstResponder());
    }
}

标签: mvvmxamarin.ios

解决方案


我使用一个按钮作为进入 tableview 的输入,在选择时我将所需的数据(在这种情况下为 id 和 name)存储在静态模型中。然后我返回父视图。

模型:

public class addUserCoinHelperModel
{
    public static string coinID { get; set; }
    public static string name { get; set; }
    public static string Amount { get; set; }
}

在视图模型中选择:

   public MvxCommand<CoinMarketCapModel> NavigateToDetailCommand
    {
        get
        {
            return new MvxCommand<CoinMarketCapModel>(
                SelectedCoin =>
                {
                    addUserCoinHelperModel.coinID = SelectedCoin.Id;
                    addUserCoinHelperModel.name = SelectedCoin.Name;
                    ShowViewModel<AddUserCoinViewModel>();
                    //ShowViewModel<CoinViewModel>(new { coinName = SelectedCoin.Id });
                }
              );
        }
    }

在 viewdidload 的视图中:

if (addUserCoinHelperModel.coinID != null){
            btnPickCoin.SetTitle(addUserCoinHelperModel.name, UIControlState.Normal);
        }

推荐阅读