在数据模板

时间:2017-09-18 12:50:35

标签: c# xamarin xamarin.forms

我创建了一个在列表视图中使用的数据模板。稍后将对此进行扩展,以便为此列表视图中的每个项目添加更多内容。目前,绑定到可观察集合的所有项目都按预期工作,除了一个。 在数据模板的每个实例中,绑定属性为height,RouteName和routeStops。高度和RouteName工作正常,但我不知道如何正确绑定routeStops。 对于每个RouteNames,有多个停靠点,因此对于每个数据模板使用,必须有一个标签具有RouteName,并且路径上的每个停靠点都有多个标签(使用routeStops)。 我不完全确定如何实现这一点,我似乎只能将一个句点绑定到一个标签。我想动态创建它们以允许任何数量的停止。

所以后面的代码创建了数据模板(只是构造函数):

public MainRoutePageViewDetail(MessagDatabase database)
    {
        InitializeComponent();

        BindingContext = mainroutepageviewmodel = new MainRoutePageViewModel(database,Navigation);

        StackLayout mainstack = new StackLayout();

        var routelisttemplate = new DataTemplate(() => {

            ViewCell viewcell = new ViewCell();


            stacklayout = new StackLayout();
            stacklayout.SetBinding(StackLayout.HeightRequestProperty,"height");

            viewcell.View = stacklayout;

            // labels for template
            var nameLabel = new Label { FontAttributes = FontAttributes.Bold, BackgroundColor = Color.LightGray };
            nameLabel.HorizontalOptions = LayoutOptions.Center;
            nameLabel.VerticalOptions = LayoutOptions.Center;               
            nameLabel.SetBinding(Label.TextProperty, "RouteName");
            //inforLabel.SetBinding(Label.TextProperty, "Stops");

            stacklayout.Children.Add(nameLabel);

            StackLayout nextstack = new StackLayout();

                var nameLabel2 = new Label { FontAttributes = FontAttributes.Bold, BackgroundColor = Color.Red };
                nameLabel2.HorizontalOptions = LayoutOptions.Center;
                nameLabel2.VerticalOptions = LayoutOptions.Center;
                nameLabel2.SetBinding(Label.TextProperty, "routeStops");
                nextstack.Children.Add(nameLabel2);

            stacklayout.Children.Add(nextstack);


            return viewcell;
        });

        ListView listviewofroutes = new ListView();

        mainstack.Children.Add(listviewofroutes);


        listviewofroutes.SetBinding(ListView.ItemsSourceProperty, "routeLabels");
        listviewofroutes.ItemTemplate = routelisttemplate;
        listviewofroutes.HasUnevenRows = true;

        Content = mainstack;

    }// end of constructor

这与视图模型中的ObservableCollection绑定。我会把它当作无关紧要的,因为绑定工作正常。

这将调用模型中从SQL表收集数据的函数。

模型中收集数据的功能:

public List<RouteInfo> getrouteInfo()
        {
            var DataBaseSelection = _connection.Query<RouteInfoTable>("Select * From [RouteInfoTable]");
            List<RouteInfo> dataList = new List<RouteInfo>();           

            for (var i = 0; i < DataBaseSelection.Count; i++)
            {

                var DataBaseSelection2 = _connection.Query<RouteStopsTable>("Select StopOnRoute From [RouteStopsTable] WHERE RouteName = ? ",DataBaseSelection[i].RouteName);

                dataList.Add(new RouteInfo
                {
                    ID = DataBaseSelection[i].ID,
                    RouteName = DataBaseSelection[i].RouteName,
                    Stops = DataBaseSelection[i].Stops,
                    DayOf = DataBaseSelection[i].DayOf,
                    IsVisible = DataBaseSelection[i].IsVisible,
                    routeStops = DataBaseSelection2[i].StopOnRoute,
                    height = 200
                });

            }
            return dataList;
        }

第一个表(RouteInfoTable)获取RouteName和其他一些信息,第二个表使用RouteName作为键获取路径上的停靠点。这全部添加到RouteInfo实例列表中。 DataBaseSelection2抓取路径上的所有停靠点,但只显示其中一个。我知道为什么会这样,但我不知道如何显示这三个。

表定义和类定义以及表中的选择不是问题。我调试了这些,他们正在获取正确的信息我不知道如何以我想要的方式在前端显示它。如果它变得复杂,这是我的意思:

enter image description here

我能做的最好的是一条路线,不是全部三条。 一个想法如何实现这一目标? 对不起,如果它很复杂。

1 个答案:

答案 0 :(得分:0)

您可以在ListView中使用Grouping来实现此视觉效果。基本上在这种情况下,您将定义两个DataTemplate(s) -

    {li> GroupHeaderTemplate RouteName
  1. ItemTemplate代表StopsOnRoute