Xamarin 表单 - 在页面和视图之间传递数据
Xamarin forms - Passing data between pages & views
我有一个 xamarin 表单应用程序。
有 2 class 有数据,其中一页正在填充数据。
问题是:我正在创建新视图,它应该使用来自两个 classes 的数据。
我熟悉的唯一方法是将 class 设置为 bindingContext
以在页面之间传递数据,并且它与 ONE[=32= 一起工作正常] class,因为显然不可能同时有2 bindingContext
。
示例:
1st class(所有class都填写在上一页,只接受他们已填写)
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"));
}
}
}
第二 class
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
}
}
也许不需要绑定上下文,因为我只是传递参数,而不是在视图中更改它们?我想解决方案可能非常简单,但我想不出来....
你缺少的是理解 ViewModel 的概念,以及它与视图的关系。在这种情况下,你需要的是第三个 class (ViewModel) 来处理你之前的 2 个 class:
public class HouseViewModel : INotifyPropertyChanged
{
public Flats Flats { get; set; }
private Buildings Buildings { get; set; }
}
此外,使用 OnBindingContextChanged 也很麻烦,并且会影响您的应用程序的性能。尝试在您的 VM 上之前准备您的数据,因此视图对如何 get/handle 数据了解得越少越好。
有一种在 Xamarin 表单中的页面之间传输数据的简单方法。
- 在名为
Transporter.cs
的主项目中添加新的class,这个class应该是static
.
- 在此class中,添加变量以在其他页面之间传输数据;然后您可以使用
Transporter.Variable
. 简单地访问任何变量
示例:
public static Transporter
{
public static string x;
}
> 现在,在每个页面中,您可以简单地访问(设置或获取)值:
Transporter.x=MyName.Text;
>在另一页中:
MySecondName.Text=Transporter.x;
注意:MyName
是第一页的输入字段,MySecondName
是第二页的输入字段。
此外,您可以定义任何类型的变量,例如(列表、整数、对象...等)。
我有一个 xamarin 表单应用程序。 有 2 class 有数据,其中一页正在填充数据。
问题是:我正在创建新视图,它应该使用来自两个 classes 的数据。
我熟悉的唯一方法是将 class 设置为 bindingContext
以在页面之间传递数据,并且它与 ONE[=32= 一起工作正常] class,因为显然不可能同时有2 bindingContext
。
示例:
1st class(所有class都填写在上一页,只接受他们已填写)
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"));
}
}
}
第二 class
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
}
}
也许不需要绑定上下文,因为我只是传递参数,而不是在视图中更改它们?我想解决方案可能非常简单,但我想不出来....
你缺少的是理解 ViewModel 的概念,以及它与视图的关系。在这种情况下,你需要的是第三个 class (ViewModel) 来处理你之前的 2 个 class:
public class HouseViewModel : INotifyPropertyChanged
{
public Flats Flats { get; set; }
private Buildings Buildings { get; set; }
}
此外,使用 OnBindingContextChanged 也很麻烦,并且会影响您的应用程序的性能。尝试在您的 VM 上之前准备您的数据,因此视图对如何 get/handle 数据了解得越少越好。
有一种在 Xamarin 表单中的页面之间传输数据的简单方法。
- 在名为
Transporter.cs
的主项目中添加新的class,这个class应该是static
. - 在此class中,添加变量以在其他页面之间传输数据;然后您可以使用
Transporter.Variable
. 简单地访问任何变量
示例:
public static Transporter
{
public static string x;
}
> 现在,在每个页面中,您可以简单地访问(设置或获取)值:
Transporter.x=MyName.Text;
>在另一页中:
MySecondName.Text=Transporter.x;
注意:MyName
是第一页的输入字段,MySecondName
是第二页的输入字段。
此外,您可以定义任何类型的变量,例如(列表、整数、对象...等)。