如何在Xamarin Forms中获取ItemTemplate中的当前项

时间:2016-08-01 09:11:38

标签: listview xamarin.forms itemtemplate

我为项ListView设置模板并分配列表项

listView.ItemTemplate = new DataTemplate(typeof(CustomVeggieCell));  
listView.ItemsSource = posts;

如何在currentItem中获取CustomVeggieCell元素:

CustomVeggieCell.class:

    public class CustomVeggieCell : ViewCell
   {
          public CustomVeggieCell(){
        // for example int count = currentItem.Images.Count;
        var postImage = new Image
        {
            Aspect = Aspect.AspectFill,
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand
        };
        postImage.SetBinding(Image.SourceProperty, new Binding("Images[0]"));
        var postImage = new Image
        {
            Aspect = Aspect.AspectFill,
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand
        };
        postImage.SetBinding(Image.SourceProperty, new Binding("Images[1]"));
        }
    }

我想在Images中获得ItemTemplate的金额。 Images只是一个字符串列表。

P.S。我通过绑定获得ItemTemplate中的所有值。

2 个答案:

答案 0 :(得分:2)

要获取ItemTemplate中的当前项目,您只需要像CustomVeggieCell那样引用BindContext string imageString = (string)BindingContext; //Instead of string, you would put what ever type of object is in your 'posts' collection

CustomVeggieCell

话虽如此,你的代码对我来说并不完全有意义。如果您的ListView位于new Binding("Images[1]") ,则不需要通过硬编码项目的索引来访问项目列表,就像您在此处一样:

ListView

foreach基本上应该通过所有项目posts为您做。除非List<string>包含ViewCell的属性。

编辑:现在我对这个问题有了更好的了解。您可以在ViewCell上创建一个新的可绑定属性,并在OnPropertyChanged参数中指定一个方法,将图像添加到布局中,然后将布局添加到public class CustomVeggieCell : ViewCell { public List<ImageSource> Images { get { return (ImageSource)GetValue(ImagesProperty); } set { SetValue(ImagesProperty, value); } } public static readonly BindableProperty ImagesProperty = BindableProperty.Create("Images", typeof(List<ImageSource>), typeof(CustomVeggieCell), null, BindingMode.TwoWay, null, ImageCollectionChanged); private StackLayout _rootStack; public InputFieldContentView() { _rootStack = new StackLayout { Children = //Some other controls here if needed }; View = _rootStack; } private static void ImageCollectionChanged(BindableObject bindable, object oldValue, object newValue) { List<ImageSource> imageCollection = (List<ImageSource>)newValue; foreach(ImageSource imageSource in imageCollection) { (CustomVeggieCell)bindable)._rootStack.Children.Add(new Image { Source = imageSource }); } } } 。我从未尝试过这样的事情,所以这一切都可能根本不起作用。

类似的东西:

posts.Images

或类似的东西。然后,您将top绑定到新的可绑定属性。我刚刚在文本框中编写了这段代码,并且之前没有测试过这样的代码,但如果遇到问题,请告诉我。

答案 1 :(得分:0)

  1. CustomVeggieCell的构造函数中放置最小代码。例如

    content = new StackLayout(); 
    View = content; 
    

    (假设您在CustomVeggieCell的字段中声明了“私有StackLayout内容”)

  2. 在此类中,重写OnBindingContextChanged。此时,this.BindingContext包含当前项目。现在,您可以根据刚刚插入ListView的数据来调整基本stackLayout的内容。