Сохранить выбранный элемент и использовать его на другой странице

Я работаю над мобильным приложением в Xamarin.Forms. У меня есть страница «visitedDoctor» и список на этой странице. Я хочу видеть выбранного врача на главной странице, но не могу перенести выбранный пункт на главную страницу. Что я должен использовать для этого?

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

Jason 22.12.2020 01:13
0
1
375
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте класс MessagingCenter для отправки объектов между страницами:

Для отправки сообщения используйте метод MessagingCenter.Send, для подписки - используйте метод MessagingCenter.Subscribe:

Вот пример отправки строки между двумя страницами:

MessagingCenter.Send<MainPage, string> (this, "Hi", "John");

Теперь MainPage нужно подписаться:

MessagingCenter.Subscribe<MainPage, string> (this, "Hi", (sender, arg) => {
    // do whatever
});

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

Ответ принят как подходящий

Если вы хотите передать данные между двумя страницами, вы также можете сделать это с помощью конструктора, я делаю один пример передачи выбранного элемента ListView на другую страницу.

VisitedDoctor.xaml:

<ContentPage.Content>
    <StackLayout>
        <ListView ItemsSource = "{Binding doctors}" SelectedItem = "{Binding selecteditem}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation = "Horizontal">
                            <Label Text = "{Binding name}" />
                            <Label Text = "{Binding address}" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

        <Button
            x:Name = "btn1"
            Clicked = "btn1_Clicked"
            Text = "go to mainpage" />
    </StackLayout>
</ContentPage.Content>

Чтобы получить selecteditem, не забудьте реализовать интерфейс INotifyPropertyChanged для уведомления об изменении данных.

 public partial class visitedDoctor : ContentPage, INotifyPropertyChanged
{
    public ObservableCollection<doctor> doctors { get; set; }
    private doctor _selecteditem;
    public doctor selecteditem
    {
        get { return _selecteditem; }
        set
        {
            _selecteditem = value;
            RaisePropertyChanged("selecteditem");
        }
    }
    public visitedDoctor()
    {
        InitializeComponent();
        doctors = new ObservableCollection<doctor>()
        {
            new doctor(){name = "doctor 1",address = "address 1"},
            new doctor(){name = "doctor 2",address = "address 2"},
            new doctor(){name = "doctor 3",address = "address 3"},
            new doctor(){name = "doctor 4",address = "address 4"}

        };
        selecteditem = doctors[0];
        this.BindingContext = this;
    }

   
    public event PropertyChangedEventHandler PropertyChanged;

    
    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private async void btn1_Clicked(object sender, EventArgs e)
    {
       await Navigation.PushAsync(new MainPage(selecteditem));
    }
}
public class doctor
{
    public string name { get; set; }
    public string address { get; set; }
}

Главная страница:

public partial class MainPage : ContentPage
{
    public MainPage(doctor d)
    {
        InitializeComponent();

        Console.WriteLine("the selected doctor is {0}",d.name);
    }
}

Другие вопросы по теме