以Xamarin Forms绑定数据

时间:2014-08-27 22:19:22

标签: xamarin.forms

我有一个可枚举的数据源,我想绑定到Xamarin Forms中的某个控件。

我希望布局看起来像 -

ColA | ColB | ColC | ColD
  3      4      1     6
 15     25     62    26

只是带标题的标准表。

我尝试过ListView,但它不支持标题。我已经尝试了TableLayout,但它不支持绑定到数据源。

我是否遗漏了某些东西,或者我是否应该使用其他控件。

3 个答案:

答案 0 :(得分:0)

是的,没有开箱即用的控件,这是一种破解它的方法:

创建一个网格,其中包含一行标题(4列),下一行包含一个包含项目视口的列表视图,然后使用视单元素模板,并在模板中使用包含4列的网格,和4个实验室(每列1个)一样,现在这里的技巧是如何在1个视单元中绑定4个值,我的sugestions有一个像' Something'具有Prop1,Prop2,Prop3,Prop4,现在您将label1绑定到Prop1,将label2绑定到Prop2,所以, 因此,当您创建数据源时,它将类似于:

var list = List<Something>();
list.Add(new Something() { Prop1 = 3, Prop2 = 4, Prop3 = 1, Prop4 = 6});
list.Add(new Something() { Prop1 = 15, Prop2 = 25, Prop3 = 62, Prop4 = 26});

这应该可以实现你所需要的......

答案 1 :(得分:0)

正如其他StackOverflow问题中提到的 Stephane Delcroix : -

&#34; Horizontal ListView Xamarin.Forms&#34;

ListView 本身不支持水平方向,因此您无法使用此功能,因为您理想地希望绑定到 IEnumerable 数据源。

以下帖子中提到了另一种 hack 方法: -

&#34; How to adjust size of Horizontal ListView in Xamarin.Forms?&#34;

建议使用旋转来解决这个问题,尽管在旋转将应用于正常 View 边界之外的情况下,这很可能非常麻烦且有问题,除非它是方形的。

这将允许您使用可绑定数据源但是使用 ListView ItemTemplate 属性并使用其他控件绑定创建 DataTemplate 在其中指定。

然而,对于旋转黑客来说并不理想,我个人甚至不会考虑它。

目前,最好的方法是像Rui提到的那样,创建某种相等的Grid网格并在其中进行格式化。

您还可以使用 StackLayout 为每个 视图指定特定的 WidthRequest 来实现此目的然后从每个孩子中进行格式化查看

如果您需要显示的列数超过典型设备屏幕宽度的4列或更多信息,那么您可能需要将 ScrollView 作为父级 网格 StackLayout ,这样您就可以查看更好的间距,而不是填写所有内容。

作为最后的替代方案 - 您可以编写自己的自定义渲染器以支持具有可绑定数据源的水平ListView。

答案 2 :(得分:0)

<Grid x:Name="dgvEmp">
    <Grid.RowDefinitions>

    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>

    </Grid.ColumnDefinitions>
 </Grid>

&#13;
&#13;
 List<Employee> lstEmp;
        public Gridbasic()
        {
            InitializeComponent();
          lstEmp=  new List<Employee>()
            {
                new Employee()
                {
                    EmpId=1,EmpName="Test1",EmpSalary=12345
                },
                new Employee()
                {
                    EmpId=2,
                    EmpName="Test2",
                    EmpSalary=12345
                },
                new Employee()
                {
                    EmpId=3,
                    EmpName="Test3",
                    EmpSalary=12334
                }
            };
        dgvEmp.Children.Add(new Label() {Text="EmpName" }, 0, 0);
        dgvEmp.Children.Add(new Label() { Text = "EmpSal" }, 1, 0);
       
        for(int i=0,j = 1;  i <lstEmp.Count; i++)
            {
                Label lbl = new Label()
                {
                    Text = lstEmp[i].EmpName
                };
                Label llblEmpSal = new Label()
                {
                    Text = lstEmp[i].EmpSalary.ToString()
                };

                dgvEmp.Children.Add(lbl, 0, j);
                dgvEmp.Children.Add(llblEmpSal, 1, j);
                j++;
            }

        }
&#13;
&#13;
&#13;