Xamarin表单绑定到没有硬编码属性名称的自定义单元格

时间:2017-04-13 14:39:07

标签: xamarin data-binding xamarin.forms

我有一个工作列表视图,它绑定到自定义单元格。但是,我想知道我是否真的必须拥有一个名为属性的模型,就像自定义单元格属性一样。

我的自定义viewcell(遗漏了很多东西):

public TopicsPage ()
{
    _topicList = new ListView ();
    var cell = new DataTemplate (typeof (RecordListCell));
    // NOT WORKING
    // cell.SetBinding (RecordListCell.HeadingProperty, "Name");

    // working (I must name the property exactly like the property in my custom cell)
    cell.SetBinding (RecordListCell.HeadingProperty, "Heading");
    _topicList.ItemTemplate = cell;

    _topicList.ItemsSource = MyRepo.GetTopics();
}

我的页面(遗漏了很多东西)

{{1}}

所以上面的工作,但我被迫让MyRepo.GetTopics()返回一个具有名为Heading属性的对象列表。我想将这个自定义单元格重用于任何类型的对象列表,只需在页面上指定绑定,就像我的评论所示,但这并不合适。

我在这里期待错误的事情还是我的方法错了?

2 个答案:

答案 0 :(得分:1)

为label设置绑定方式是来自bindingcontext的“Header”,其中GetTopics()中没有名为“Header”的属性,因此您已将标签的绑定源设置为RecordCell。 / p>

headingLbl.SetBinding(Label.TextProperty,
                    new Binding("Heading",BindingMode.Default, null, null, null, source: this));

现在

cell.SetBinding (RecordListCell.HeadingProperty, "Name");

此代码应该有效,希望有所帮助!

答案 1 :(得分:0)

ListView项目的BindingContext与项目的模型相关联。你必须想出另一种方法将这些数据插入到视图单元格中。数据模板。

您可以更改自定义视图单元构造函数以接受(每页)标题值

lon = seq(1, 360, length.out = nrow(precip)) lat = seq(1, 360, length.out = ncol(precip))

并将其指定为标题值(因为它将是每页唯一的),其余的视单元内容可以照常绑定到项目源。

然后,您将使用不同的DataTemplate构造函数来创建模板:

MyCustomCell(string perPageHeadingText)