【问题标题】:MvvmCross - Passing a string with IMvxNavigationServiceMvvmCross - 使用 IMvxNavigationService 传递字符串
【发布时间】:2018-04-07 13:50:02
【问题描述】:

我目前正在开发一个使用 web-api 收集数据的 Xamarin.iOS 项目。但是,我在尝试将用户输入从文本字段传递到从 api 获取结果的 Tableview 时遇到了一些问题。

为此,我遵循了MvvmCross documentation 上的示例。

问题是来自文本字段的输入永远不会到达我的 TableviewController 的视图模型中的“过滤器”属性。我想我在调用时没有将字符串对象正确传递给我的 IMvxNavigationService。

为了澄清,在我的 UserinputViewController 中,我正在绑定文本字段的文本,如下所示:

    [MvxFromStoryboard(StoryboardName = "Main")]
    public partial class SearchEventView : MvxViewController
    {
        public SearchEventView (IntPtr handle) : base (handle)
        {
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            MvxFluentBindingDescriptionSet<SearchEventView, SearchEventViewModel> set = new MvxFluentBindingDescriptionSet<SearchEventView, SearchEventViewModel>(this);

            set.Bind(btnSearch).To(vm => vm.SearchEventCommand);
            set.Bind(txtSearchFilter).For(s => s.Text).To(vm => vm.SearchFilter);
            set.Apply();
        }
      }

链接到这个 ViewController 的 Viewmodel 如下所示:

public class SearchEventViewModel : MvxViewModel
{
    private readonly IMvxNavigationService _navigationService;  

    private string _searchFilter;

    public string SearchFilter
    {
        get { return _searchFilter; }
        set { _searchFilter = value; RaisePropertyChanged(() => SearchFilter); }
    }

    public SearchEventViewModel(IMvxNavigationService mvxNavigationService)
    {
        this._navigationService = mvxNavigationService;
    }

    public IMvxCommand SearchEventCommand {
        get {
            return new MvxCommand<string>(SearchEvent);
        }
    }

    private async void SearchEvent(string filter)
    {
        await _navigationService.Navigate<EventListViewModel, string>(filter);
    }
}

最后,TableviewController 的视图模型如下所示:

public class EventListViewModel : MvxViewModel<string>
{
    private readonly ITicketMasterService _ticketMasterService;
    private readonly IMvxNavigationService _navigationService;
    private List<Event> _events;

    public List<Event> Events
    {
        get { return _events; }
        set { _events = value; RaisePropertyChanged(() => Events); }
    }

    private string _filter;

    public string Filter
    {
        get { return _filter; }
        set { _filter = value; RaisePropertyChanged(() => Filter); }
    }


    public EventListViewModel(ITicketMasterService ticketMasterService, IMvxNavigationService mvxNavigationService)
    {
        this._ticketMasterService = ticketMasterService;
        this._navigationService = mvxNavigationService;
    }

    public IMvxCommand EventDetailCommand {
        get {
            return new MvxCommand<Event>(EventDetail);
        }
    }

    private void EventDetail(Event detailEvent)
    {   
        _navigationService.Navigate<EventDetailViewModel, Event>(detailEvent);
    }

    public override void Prepare(string parameter)
    {
        this.Filter = parameter;
    }

    public override async Task Initialize()
    {
        await base.Initialize();
        //Do heavy work and data loading here
        this.Events = await _ticketMasterService.GetEvents(Filter);
    }
}

每当尝试运行时,我的 TableviewController 的 Prepare 函数中的字符串对象“参数”保持为“空”,我不知道如何修复它。非常感谢任何帮助!

【问题讨论】:

    标签: c# xamarin.ios parameter-passing mvvmcross navigationservice


    【解决方案1】:

    我认为问题出在您的命令设置上

    new MvxCommand<string>(SearchEvent);
    

    因为这个命令被绑定到一个标准的 UIButton。它不会传递过滤器的参数值,而是传递 null。所以可以去掉字符串参数generic。此外,由于您想执行异步方法,我建议您使用MvxAsyncCommand

    new MvxAsyncCommand(SearchEvent);
    

    那么就SearchEvent方法而言,你可以去掉参数。 filter 的值绑定到您的 SearchFilter 属性。您要作为导航参数发送的正是此属性的值。

    private async Task SearchEvent()
    {
        await _navigationService.Navigate<EventListViewModel, string>(SearchFilter);
    }
    

    【讨论】:

    • 这个解决方案就像一个魅力!如果问的不是太多,您能否澄清何时应该使用参数泛型?在同一个项目中,我将 resultList 中的单个对象传递给 detailViewController,如果没有它,它将无法工作。
    • @K.Warrens 当然,对于 UIButton,默认绑定是 TouchUpInside,它将通过 null 传递给命令。而 TableViewSource 允许绑定到 SelectionChangedCommand,这将通过 ViewModel 选择行。因此,可以在命令粘贴对象的任何时候使用它们。我希望这会有所帮助:)
    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    相关资源
    最近更新 更多