Как вызвать другой метод из другого класса с помощью Popup?

#c# #xamarin #xamarin.forms

#c# #xamarin #xamarin.forms

Вопрос:

Я использую Rg.Плагины.Всплывающий плагин:

Всплывающее окно предназначено для выбора пользователей, которым будет назначена новая страница задач. Когда я выбираю пользователя из ListView , он должен вызывать другой метод на NewTask странице для отображения выбранного пользователя.

С чем у меня возникают проблемы, так это с тем, что когда я пытаюсь вызвать другой метод из NewTask класса, он ничего не делает, и я буду признателен за вашу помощь! Мне нужно вызвать метод в NewTask классе из SearchUsers класса для передачи данных. Я также пытался использовать MessagingCenter , и он по-прежнему не отображает данные из SearchUsers класса в NewTask класс.

SearchUsers.xaml

     <StackLayout VerticalOptions="Center" Padding="20, 0" HorizontalOptions="FillAndExpand">
        <Frame Padding="0" BackgroundColor="White">
            <StackLayout Padding="10, 0, 10, 10">
                <StackLayout Orientation="Horizontal">
                    <Label Text="Search Existing Users" HorizontalOptions="StartAndExpand" FontAttributes="Bold" VerticalOptions="Center"/>
                    <Button Text="Close" Clicked="ClosePopup" HorizontalOptions="End" BackgroundColor="Transparent"/>
                </StackLayout>
                <ScrollView x:Name="usersScrollView">
                    <ListView x:Name="usersList" ItemSelected="usersList_ItemSelected">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <ViewCell>
                                    <Label Text="{Binding Name}" VerticalOptions="Center"/>
                                </ViewCell>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </ScrollView>
            </StackLayout>
        </Frame>
    </StackLayout>
  

SearchUsers.xaml.cs

     public partial class SearchUsers : PopupPage
    {
        ...

        void usersList_ItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            var selectedItem = e.SelectedItem as Users;

            NewTask newT = new NewTask();
            newT.SelectedUser(selectedItem);
            PopupNavigation.Instance.PopAsync(true);

            //DisplayAlert("HI", selectedItem.Email, "DONE");

            //NewTask.SelectedUser(selectedItem);

            //MessagingCenter.Send(new Users() { Id = selectedItem.Id, Name = selectedItem.Name, Email = selectedItem.Email }, "PopUpData");
        }
    }
  

NewTask.xaml.cs

      public partial class NewTask : ContentPage
    {
        public NewTask()
        {
            InitializeComponent();
        }

        public void SelectedUser(Users u)
        {
            SelectedUserView.SetValue(IsVisibleProperty, true);
            SelectedUserName.Text = u.Name;
            SelectedUserEmail.Text = u.Email;

            //DisplayAlert("HI", u.Name   " : "   u.Email, "DONE");

            //MessagingCenter.Subscribe<Users>(this, "PopUpData", (value) =>
            //{
            //    SelectedUserView.SetValue(IsVisibleProperty, true);
            //    SelectedUserName.Text = value.Name;
            //    SelectedUserEmail.Text = value.Email;
            //});
        }
  

NewTask.xaml

 <ContentPage Title="Add New Task" xmlns="http://xamarin.com/schemas/2014/forms"  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="TaskApp.Task.NewTask">
<ContentPage.ToolbarItems>
    <ToolbarItem Text="Create" Order="Primary" Clicked="AddTask"/>
</ContentPage.ToolbarItems>
<StackLayout>
    <TableView Intent="Form" HasUnevenRows="True">
        <TableRoot>
            <TableSection Title="Search Existing Users">
                <ViewCell>
                    <StackLayout>
                        <StackLayout Orientation="Horizontal" Padding="13, 5">
                            <Button Image="search.png" Text="Select a User" HorizontalOptions="FillAndExpand" Clicked="SearchUsers"/>
                        </StackLayout>
                        <StackLayout Padding="13, 5" x:Name="SelectedUserView" IsVisible="false">
                            <Label x:Name="SelectedUserName" />
                            <Label x:Name="SelectedUserEmail" />
                        </StackLayout>
                    </StackLayout>
                </ViewCell>
            </TableSection>
            ...
        </TableRoot>
    </TableView>
</StackLayout>
  

Комментарии:

1. usersList_ItemSelected создает новый экземпляр NewTask , он не использует экземпляр, который уже существует. MessagingCenter это хороший способ передачи сообщений между классами. В документах есть отличные примеры

2. @Jason Как я упоминал выше, я пытался использовать MessagingCenter, но он по-прежнему не передает данные. Не могли бы вы посмотреть мои приведенные выше комментарии к кодам для MessagingCenter и посмотреть, что я делаю не так?

3. вам нужно вызвать Subscribe в конструкторе

4. Я бы использовал обработчик событий вместо MessagingCenter и да, он не использует существующий NewTask , что, по-видимому, ожидается. Popuppage вызывается после NewTask, и вы пытаетесь вернуть и отобразить выбранные значения?

5. @Morse Не могли бы вы предоставить пример кода? Я буду очень признателен.