我在Xamarin.Forms中使用ListView
。我还将ItemTemplate
设置为我自己的DataTemplateSelector
课程,以选择将ViewCell
用作每个项目的DataTemplate
。
如何在每个ViewCell的.cs文件中访问该列表视图项的数据?我试图不使用带有
的xaml文件public class SurveyCell : ViewCell
{
public SurveyCell()
{
StackLayout stackLayout = new StackLayout();
stackLayout.Children.Add(new Label()
{
Text = "data from the current item here"
});
View = stackLayout;
}
}
我可以通过绑定看到一个如何使用.xaml文件执行此操作的示例: https://github.com/nishanil/Xamarin.Forms-Samples/blob/master/DataTemplateSelector/DataTemplateSelector/DataTemplateSelector/CustomCells/OutgoingViewCell.xaml
但我只使用.cs但没有匹配的.xaml文件。
答案 0 :(得分:1)
我不确定是否有更好的练习方法可以做到这一点,但是覆盖OnBindingContextChanged
并在那里构建ViewCell
似乎有效。 BindingContext
在构造函数中为null,但在OnBindingContextChaanged
public class NewsCell : ViewCell
{
public NewsCell()
{
//null here
NewsItem data = (NewsItem)BindingContext;
}
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
// works here
NewsItem data = (NewsItem)BindingContext;
}
}
答案 1 :(得分:0)
您的ViewCell
会接收BindingContext
集合中单个项目的ListView.ItemSource
。
因此,您可以将Label.Text
绑定到项目的值,如下所示:
示例调查模型:
public class Survey {
public SurveyName { get; set; }
}
SurveyCell示例:
public class SurveyCell : ViewCell {
public SurveyCell() {
Label label = new Label();
label.SetBinding(Label.TextProperty, nameof(Survey.SurveyName));
//label.SetBinding(Label.TextProperty, "SurveyName"); //This is the same as above but without having to use a "magic string", this way works without C# 6 though
View = new StackLayout {
Children = { label }
};
}
}
答案 2 :(得分:0)
您可以使用以下命令获取列表视图中的对象:
var ctx = (myobject)this.BindingContext; //use it in the viewcell
如果没有,你可以查看这篇文章 Listview DataTemplateSelector pass parameter to DataTemplate