Как отправить данные обратно на родительскую страницу в формах xamarin? - PullRequest
0 голосов
/ 04 июня 2018

На странице Account есть метка, которая при нажатии на нее создаст новый ContentPage со списком адресов помещения.Нажатие на любой из адресов должно вызвать ContentPage и отправить обратно значение на страницу Account, чтобы установить определенные поля на странице Account.Я пытался использовать Messaging Center, но, похоже, он не может получить значение.Чего мне не хватает?

Это код, который создает ContentPage с адресами помещения:

 private void ddlPremisesAddNavigation()
    {
        PremiseListPage = CreatePAContentPage();
        var tgrddlPremiseAddress = new TapGestureRecognizer();
        NavigationPage.SetHasNavigationBar(PremiseListPage, false);

        tgrddlPremiseAddress.Tapped += (s, e) =>
        {
            Navigation.PushAsync(PremiseListPage);
        };
        //  ddlPremiseAddresses.GestureRecognizers.Add(tgrddlPremiseAddress);
        lblpremiseAddress.GestureRecognizers.Add(tgrddlPremiseAddress);
    }
    private ContentPage CreatePAContentPage()
    {
        #region Containers
        ContentPage content = new ContentPage();
        StackLayout pageContent = new StackLayout();
        ScrollView addressesView = new ScrollView()
        {
            // BackgroundColor = Color.White,
            Padding = new Thickness(20, 10, 20, 10)
        };
        StackLayout addressContainer = new StackLayout();
        #endregion
        #region Header
        RowDefinitionCollection RowDefinitions = new RowDefinitionCollection();
        ColumnDefinitionCollection ColumnDefinitions = new ColumnDefinitionCollection();
        RowDefinitions.Add(new RowDefinition { Height = new GridLength(50, GridUnitType.Absolute) });

        Grid header = new Grid()
        {
            RowDefinitions = RowDefinitions,
        };

        BoxView bg = new BoxView() { HeightRequest = 50, WidthRequest = 250, BackgroundColor = Color.White };
        header.Children.Add(bg, 0, 0);
        Grid.SetColumnSpan(bg, 5);

        Label title = new Label()
        {
            Text = "Premise Address",
            FontSize = 15,
            FontAttributes = FontAttributes.Bold,
            VerticalOptions = LayoutOptions.CenterAndExpand,
            HorizontalOptions = LayoutOptions.CenterAndExpand
        };
        header.Children.Add(title, 1, 0);
        Grid.SetColumnSpan(title, 3);
        Button back = new Button() { Image = "backArrow", BackgroundColor = Color.White };//
        header.Children.Add(back, 0, 0);
        Grid.SetColumnSpan(back, 1);
        back.Clicked += back_Clicked;
        #endregion
        #region Address Frames
        List<Frame> addrFrames = new List<Frame>();

        if (premiseAddresses.Count <= 0)
        {
            foreach (PremisesModel premise in Premises)
            {
                premiseAddresses.Add(premise.PremiseId, premise.PremiseAddress);
            }
        }


        foreach (KeyValuePair<int,string> item in premiseAddresses)
        {
            addrFrames.Add(CreatePAFrame(item));
        }

        #endregion
        #region Add Content to Containers

        foreach (Frame item in addrFrames)
        {
            addressContainer.Children.Add(item);
        }
        //  < Button x: Name = "btnReqAmendment" Text = "Request amendment" Style = "{StaticResource buttonStyle}" Clicked = "btnReqAmendment_Clicked" />
        Button addNew = new Button()
        {
            Text = "ADD NEW PREMISE ADDRESS",
            Style = Application.Current.Resources["buttonStyle"] as Style,
            HorizontalOptions = LayoutOptions.CenterAndExpand,
            Margin = new Thickness(0, 20, 2, 15)
            //FontSize = 12,
            //WidthRequest = 220,
            //HeightRequest = 40
        };
        addNew.Clicked += btnAddNewPremise_Clicked;
        addressContainer.Children.Add(addNew);

        addressesView.Content = addressContainer;
        pageContent.Children.Add(header);
        pageContent.Children.Add(addressesView);
        content.Content = pageContent;

        #endregion

        return content;
    }
    private Frame CreatePAFrame(KeyValuePair<int, string> premiseAddress)
    {
        Frame frame = new Frame() { Padding = new Thickness(5, 5, 3, 5), HeightRequest = 60 };
        StackLayout content = new StackLayout() { Padding = 0 };
        content.Orientation = StackOrientation.Horizontal;

        Label pAddress = new Label();
        pAddress.Text = premiseAddress.Value;
        pAddress.Style = Application.Current.Resources["LabelStart"] as Style;
        pAddress.HeightRequest = 50;
        pAddress.HorizontalOptions = LayoutOptions.StartAndExpand;

        Image img = new Image()
        {
            Source = "rightArrow",
            HorizontalOptions = LayoutOptions.End,
            VerticalOptions = LayoutOptions.CenterAndExpand
        };
        content.Children.Add(pAddress);
        content.Children.Add(img);

        frame.Content = content;

        var selectAddress = new TapGestureRecognizer();
        selectAddress.Tapped += (s, e) =>
        {
            MessagingCenter.Send(this, "premiseId", premiseAddress.Key);
            Navigation.PopAsync();
        };
        frame.GestureRecognizers.Add(selectAddress);
        return frame;
    }

И вот как он подписывается на Центр сообщений:

public Account()
    {
        MessagingCenter.Subscribe<ContentPage,int>(this, "premiseId", (sender,arg) =>
        {
            DisplayAlert("Premise Changed", "test", "OK");
            selectedPremise = arg;
            DisplaySelectedPremiseValues();
        });
        InitializeComponent();
}

1 Ответ

0 голосов
/ 04 июня 2018

Одним из вариантов может быть использование глобальной переменной (например, в App.cs) и установка этой переменной при каждом прикосновении к элементу списка:

public static Address TappedAddress;

И перед отображением в виде списка сбросьте эту переменную.

...