获取弹出页面的公共变量

时间:2017-12-01 22:31:17

标签: xamarin xamarin.forms

我正在实例化另一个页面,我将一个值分配给它的一个公共属性(“SomeValue”),如下所示:

        _btnGotoOtherPage.Clicked += async (sender, e) =>
        {
            OtherPage _otherpage = new OtherPage;
            _otherpage.SomeValue = 1033;
            await Navigation.PushAsync(_otherpage);
            return;
        };

在此“_otherpage”中,用户可以修改此值。

当弹出“_otherpage”时,我想看一下“SomeValue”变量并对它做些什么。

MessagingSystem不是我需要的,因为我不希望收到有关价值变化的通知。我只想知道弹出“_otherpage”时这个值是什么。

我也不想使用Binding(如果可能的话!),因为当我处理许多这样的变量时,我觉得很难组织。

是否可以通过一个事件来做到这一点?

我的梦想解决方案是(伪代码):

private void OnPagePopped()
{
    int iNewValue = PoppedPage.SomeValue;
}

谢谢。

4 个答案:

答案 0 :(得分:1)

这就是我使用弹出窗口的方式,但它可以以相同的方式与页面样式一起使用。

这是我的小例子,期待MainPage = new NavigationPage(new Page1());

基本上是关于公共财产所在的页面上有一个Task。此任务可以返回公共属性的值。该任务将在OnDisappearing覆盖中完成并返回公共属性。

要获取值,请按页面并等待“任务”页面.PagePoppedTask

using System;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace MVVMTests
{
    /// <summary>
    /// A base implementation for a page, that holds a task, 
    /// which can be completed and returns a value of type of the generic T
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ResultContentPage<T> : ContentPage
    {
            public Task<T> PagePoppedTask { get { return tcs.Task; } }
            private TaskCompletionSource<T> tcs;

            public ResultContentPage()
            {
                tcs = new TaskCompletionSource<T>();
            }

            /// <summary>
            /// Completes the task and sets it result
            /// </summary>
            /// <param name="result"></param>
            protected /* virtual */ void SetPopupResult(T result)
            {
                if (PagePoppedTask.IsCompleted == false)
                    tcs.SetResult(result);
            }
    }

    /// <summary>
    /// Page1 exists of one button, that creates the Page2, assigns a value to a prop on the Page2
    /// and then awaits the PagePoppedTask of Page2
    /// </summary>
    public class Page1 : ContentPage
    {
        public Page1()
        {
            var button = new Button()
            {
                Text = "Go to page 2"
            };
            button.Clicked += Button_Clicked;

            Content = button;
        }

        private async void Button_Clicked(object sender, EventArgs e)
        {
            //Push the page
            var newPage = new Page2() { CoolInt = 123 };
            await App.Current.MainPage.Navigation.PushAsync(newPage);

            //Await the result
            int result = await newPage.PagePoppedTask;
            System.Diagnostics.Debug.WriteLine("Page result: " + result.ToString());
        }
    }

    /// <summary>
    /// Inherits from the ResultContentPage and sets the PagePoppedTask as soon as its Disappearing
    /// </summary>
    public class Page2 : ResultContentPage<int>
    {
        public int CoolInt { get; set; }    //Your property on the page

        public Page2()
        {
            var button = new Button()
            {
                Text = "Go back to page 1"
            };
            button.Clicked += Button_Clicked;

            Content = button;
        }

        private async void Button_Clicked(object sender, EventArgs e)
        {
            CoolInt = 321;                                      //assign dummy value to CoolInt prop and pop the page
            await App.Current.MainPage.Navigation.PopAsync();   //pop the page
        }

        protected override void OnDisappearing()
        {
            base.OnDisappearing();
            SetPopupResult(CoolInt);    //set the result of the task (in ResultContentPage<T>)
        }
    }
}

答案 1 :(得分:0)

在页面A:

MessagingCenter.Subscribe<string>(this, "SomeMessage", (s) => HandleMessage(s));

在第B页:

MessagingCenter.Send<string>("SenderOrAnythingElse", "SomeMessage");

答案 2 :(得分:0)

在PageB中有公共变量:

public int SomeValue { get; set; }                

现在我们展示PageB:

PageB nPageB = new PageB;
await Navigation.PushAsync(nPageB);

在nPageB中,用户现在可以更改PageB的公共变量

//we track the "Disappearing" event of the page.
//When it occurs, we get the value

nPageB.Disappearing += async (sender1, e1) =>
{
    Debug.WriteLine("New value is: " + nPage.SomeValue.ToString());
};

答案 3 :(得分:0)

如果您正在寻找理想的解决方案,我建议您遵循MVVM模式并将大量代码从页面移到视图模型。

我使用名为FreshMvvm的MVVM框架。这允许我执行视图模型来查看模型导航并在它们之间传递参数,如下所示:

await CoreMethods.PushPageModel<BPageModel>(myParameter, true);

这将myParameter传递给我可以在BPage视图模型的Init方法中访问的BPage。

当我弹出B页面(通过视图模型)时,我可以将参数传递回A页

await CoreMethods.PopPageModel(myReturnParam, true);

我可以在APageViewModel的ReverseInit方法中访问。

大多数MVVM框架都具有类似的功能。

Here are more details about FreshMvvm