Xamarin формы - передача данных между страницами и представлениями
У меня есть приложение формы xamarin. Есть 2 класса с данными, одна из страниц заполняет данные.
Проблема в том, что я создаю новое представление, которое должно использовать данные из обоих классов.
Единственный способ, которым я знаком, - это установить класс как bindingContext
передавать данные между страницами, и это нормально работает с одним классом, потому что, очевидно, не может быть 2 bindingContext
в то же время.
ПРИМЕР:
1-й класс (все классы заполнены на предыдущей странице. Просто примите, что они заполнены)
public class Buildings : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _id;
public string Id
{
get { return _id; }
set
{
_id = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Id"));
}
}
}
2-й класс
public class Flats : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _num;
public string Num
{
get { return _num; }
set
{
_num = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Num"));
}
}
}
новый взгляд:
public partial class HouseView
{
private Flats _flats;
private Buildings _buildings;
public HouseView()
{
InitializeComponent();
}
private void HouseView_OnBindingContextChanged(object sender, EventArgs e)
{
var building = BindingContext as Building;
//var flat = BindingContext as Flat;
//_flat = flat;
_building = building;
var buildingInfo = await Rest.GetHouseInfo(_building.Id, _flat.Num); //function that will return info on a current house;
// rest code
}
}
Может быть, нет необходимости связывать контекст, потому что я просто передаю параметры, а не изменяю их в представлении? Я думаю, что решение может быть довольно простым, и я не могу понять это....
2 ответа
Чего вам не хватает, так это понимания концепции ViewModel и ее связи с представлениями. В данном случае вам нужен третий класс (ViewModel), который обрабатывает ваш 2 предыдущих класса:
public class HouseViewModel : INotifyPropertyChanged
{
public Flats Flats { get; set; }
private Buildings Buildings { get; set; }
}
Кроме того, использование OnBindingContextChanged просто беспорядочно и отнимет у вашего приложения некоторую производительность. Попробуйте подготовить ваши данные раньше на вашей виртуальной машине, чтобы представление как можно меньше узнало, как получать / обрабатывать данные.
Существует простой способ передачи данных между страницами в формах Xamarin.
- Добавьте новый класс в основной проект с именем
Transporter.cs
, и этот класс должен бытьstatic
. - Внутри этого класса добавьте переменные для передачи данных между другими страницами; то вы можете просто получить доступ к любой переменной, используя
Transporter.Variable
.
Пример:
public static Transporter
{
public static string x;
}
> Теперь на каждой странице вы можете просто получить доступ (установить или получить) значение:
Transporter.x=MyName.Text;
>На другой странице:
MySecondName.Text=Transporter.x;
Примечание:
MyName
поле ввода на первой странице, и
MySecondName
поле ввода на второй странице.
Кроме того, вы можете определить любой тип переменных, таких как (Lists, int, object... и т. д.).