xamarin ListView如何在视图单元格中获取当前项目或BindingContext?

时间:2016-11-29 03:19:19

标签: xamarin.forms

我在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文件。

3 个答案:

答案 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