我想要实现的目标:
我有一个使用Xamarin forms开发的应用程序,通过API调用检索数据,这些数据设置为GamesResultModel并绑定到.APP中的公共属性,然后在列表视图中显示数据。现在,当使用多个页面时,每个页面绑定所需的数据时,它可以正常工作,但是我只想使用一个页面,该页面被实例化多次,并在实例化时设置绑定源和页面标题。
问题:
我不确定如何在从rootpage实例化页面时设置页面的绑定源?我尝试了下面的方法,但没有成功。
public static GamesPageModel Future { get; set; }
FuturePage.SetBinding(ListView.ItemsSourceProperty, "Future");
代码示例:
public class RootPage : TabbedPage
{
public static GamesPageModel History { get; set; }
public static GamesPageModel Current { get; set; }
public static GamesPageModel Future { get; set; }
public RootPage()
{
ShowLoginDialog();
buildTabs();
}
从根页面开始,我为每个时间段实例化一个新的GamesPage实例:
private void buildTabs()
{
var historyPage = new GamesPage();
historyPage.Title = "History";
historyPage.SetBinding(ListView.ItemsSourceProperty, "History");
var todayPage = new GamesPage();
todayPage.Title = "Current";
todayPage.SetBinding(ListView.ItemsSourceProperty, "Today");
var FuturePage = new GamesPage();
FuturePage.Title = "Future";
FuturePage.SetBinding(ListView.ItemsSourceProperty, "Future");
this.Children.Add(todayPage);
this.Children.Add(historyPage);
this.Children.Add(futurePage);
}
游戏结果模型,其中设置了API调用:
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class GamesResult
{
[System.Xml.Serialization.XmlArrayItemAttribute("item", IsNullable = false)]
public xmlItem[] previous { get; set; }
[System.Xml.Serialization.XmlArrayItemAttribute("item", IsNullable = false)]
public xmlItem[] current { get; set; }
[System.Xml.Serialization.XmlArrayItemAttribute("item", IsNullable = false)]
public xmlItem[] future { get; set; }
}
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class xmlItem
{
public ushort field_id { get; set; }
public string field_desc { get; set; }
public ushort fk_round_id { get; set; }
public string field_start_time { get; set; }
public byte tee_interval { get; set; }
public byte fk_course_id { get; set; }
public uint field_pin { get; set; }
public ushort fourball_id { get; set; }
public ushort fk_field_id { get; set; }
public ushort fk_course_hole_id_tee_off { get; set; }
public string tee_off_time { get; set; }
public ushort fourball_team_id { get; set; }
public byte team_desc { get; set; }
public ushort fk_fourball_id { get; set; }
public ushort fourball_player_id { get; set; }
public ushort fk_player_mem_id { get; set; }
public byte player_hc { get; set; }
public ushort fk_player_team { get; set; }
public byte fk_player_tee { get; set; }
public ushort round_id { get; set; }
public string round_desc { get; set; }
public ushort fk_tour_id { get; set; }
public string round_date { get; set; }
public ushort tour_id { get; set; }
public string tour_desc { get; set; }
public xmlItemTour_start tour_start { get; set; }
public xmlItemTour_end tour_end { get; set; }
public ushort fk_member_id { get; set; }
public xmlItemCreate_date create_date { get; set; }
public byte fk_comp_typ_id { get; set; }
public byte tour_status { get; set; }
}
游戏页面:
public class GamesPage : ContentPage
{
#region Private Properties
private GamesPageModel viewModel
{
get { return BindingContext as GamesPageModel; }
}
private ListView listView;
#endregion
this.Content = new StackLayout()
{
Children ={
listView
}
};
}
public GamesPage()
{
this.SetBinding(TitleProperty, "Title");
listView = new ListView();
var viewTemplate = new DataTemplate(typeof(GameViewCell));
listView.ItemTemplate = viewTemplate;
listView.SetBinding(ListView.ItemsSourceProperty, "Games");
游戏页面模型:
public class GamesPageModel
{
public GamesPageModel()
{
Games = new List<xmlItem>();
}
public string Title { get; set; }
public List<xmlItem> Games { get; set; }
}
游戏视图单元格:
public class GameViewCell : ViewCell
{
public GameViewCell()
{
Label tour_Desc = new Label()
{
Font = Font.BoldSystemFontOfSize(15)
};
Label round_Desc = new Label();
Label field_Desc = new Label();
tour_Desc.SetBinding(Label.TextProperty, "tour_desc");
round_Desc.SetBinding(Label.TextProperty, "round_desc");
field_Desc.SetBinding(Label.TextProperty, "field_desc");
var layout = new StackLayout();
layout.Children.Add(tour_Desc);
layout.Children.Add(round_Desc);
layout.Children.Add(field_Desc);
this.View = layout;
}
}
单例模式用于在API调用返回数据时设置数据,以便在应用程序中的任何地方使用:
public class App
{
private static readonly App instance = new App();
private LoginResult loginResult;
private GamesResult gamesResult;
public static App Instance
{
get
{
return instance;
}
}
public LoginResult LoginResult
{
get
{
return loginResult;
}
set
{
loginResult = value;
}
}
public GamesResult GamesResult
{
get
{
return gamesResult;
}
set
{
gamesResult = value;
}
}
}
通过多页简单实现,以下示例演示了其工作方式:
var todayPage = new CurrentGamesPage();
var historyPage = new HistoryGamesPage();
var futurePage = new FutureGamesPage();
this.Children.Add(todayPage);
this.Children.Add(historyPage);
this.Children.Add(futurePage);
public class HistoryGamesPage : ContentPage
{
private ListView listView;
public HistoryGamesPage()
{
Title = "Current Games";
listView = new ListView();
BindData();
this.Content = new StackLayout()
{
Children = {
listView
}
};
}
public void BindData()
{
if (App.Instance.GamesResult != null)
{
try
{
var viewTemplate = new DataTemplate(typeof(GameViewCell));
listView.ItemTemplate = viewTemplate;
listView.ItemsSource = App.Instance.GamesResult.previous;
}
catch(Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
}