0

我是 Xamarin 表单的新手,不知道如何处理这种情况。我尝试以多种方式实现它,但没有成功。

我有一个页面,当用户进行操作时(在文本框中写入文本并使用回车键发送),我的应用程序必须进行一些检查。根据检查的结果,可能需要显示一个模式页面,其中包含要选择的项目列表。用户进行选择过程必须继续进行其他检查。这是我的问题,因为在接下来的检查中,我必须显示另一个页面。用户必须进行选择/输入某个日期,然后继续完成该过程,但不会出现此页面。我正在使用消息中心订阅模式页面。第一个模态页面出现并进行选择。第二个模态页面永远不会显示,然后进程永远不会完成。这是我的一些代码:

                NavigationPage navigationPage = new NavigationPage(new ListItemsPage(products));
                Navigation.PushModalAsync(navigationPage);

                MessagingCenter.Subscribe<ListItemsPage, Guid?>(this, "Select product", (obj, item) =>
                {
                    try
                    {
                        if (item != null)
                        {
                            product = products.SingleOrDefault(x => x.Guid == item);
                            if (product != null) ProcessLine(product);
                        }                            
                    }
                    catch(Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        MessagingCenter.Unsubscribe<ListItemsPage, Guid?>(this, "Select product");
                    }                       
                });

在 ListItemsPage 上,当项目被选中时,我有这个代码:

private  void MenuItem_Clicked(object sender, EventArgs e)
    {
         // some logic...         
        Navigation.PopModalAsync();
        MessagingCenter.Send(this, "Select product", SelectedGuid);            

    }

SelectedGuid 是一个 Guid 类型的数据,当 debbugin 被很好地选择时。使用 ProcessLine 方法时会出现问题。

private void ProcessLine(Product product) {
    // make some logic...
    NavigationPage navigationPage = new NavigationPage(new ControlUnitsPage(model));
    Navigation.PushModalAsync(navigationPage);
    
    MessagingCenter.Subscribe<ControlUnitsPage, ControlUnits>(this, "Select units, date and lot code", (obj, item) =>
    {
           try
                    {
                        if (item != null)
                        {
                            _date = item.Date;
                            _code = item.Code;
                            _units = item.Units;

                            Save(productLine, product, _units, _date,_code);
                        }
                    }
                    catch(Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        MessagingCenter.Unsubscribe<ControlUnitsPage, ControlUnits>(this, "Select units, date and lot code");
                    }
                    
                });
   
 }

ControlUnitsPage 与最后一页具有相同的结构。首先创建一个 PopModalAsync,然后发送发送 ControlUnits 类型实例的消息。

    private void Button_Clicked(object sender, EventArgs e)
    {
       //some logic...
       Item = new ControlUnits() { Date = DateField.Date, Code = CodeField.Text, Units = int.Parse(SelectedUnits.Value.ToString()) };
       Navigation.PopModalAsync();
       MessagingCenter.Send(this, "Select units, date and lot code", Item);         
    }

我认为问题出在调用方法的顺序上,但不知道正确的顺序是什么,因为我无法理解 pushmodal、popmodal 方法的工作原理,如果在那之后订阅,我是否应该使用 await 。我真的不知道,我需要帮助,请。

太感谢了!

4

1 回答 1

0

你的SendSubscribe调用需要使用匹配的参数

如果Subscribe看起来像这样

MessagingCenter.Subscribe<ControlUnitsPage, ControlUnits>(this, "Select units, date and lot code", (obj, item) => ... );

然后Send需要匹配

MessagingCenter.Send<ControlUnitsPage, ControlUnits>(this, "Select units, date and lot code", Item);
于 2021-06-14T11:55:21.480 回答