Я работаю над мобильным приложением в Xamarin.Forms. У меня есть страница «visitedDoctor» и список на этой странице. Я хочу видеть выбранного врача на главной странице, но не могу перенести выбранный пункт на главную страницу. Что я должен использовать для этого?
Используйте класс 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);
}
}
Ваше описание структуры вашего приложения невероятно расплывчато. Вообще говоря, есть много разных способов приблизиться к этому. Вы можете использовать MessagingCenter для передачи значения между страницами. Вы можете создать свойство в своем классе приложений для хранения значения. Вы можете использовать одноэлементную виртуальную машину для хранения значений для всего приложения.