#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 Не могли бы вы предоставить пример кода? Я буду очень признателен.