2014-10-15 2 views
2

Я только начал играть с Xamarin.Forms, и у меня есть вопрос о ListView и ответа нет в Интернете. В приведенном ниже коде мне нужно в ItemTemplate получить индекс элемента или способ доступа к ItemSource, отображаемому в ячейке, так как мне нужно создать путь к отображаемому изображению. Лучше, если я могу иметь как индекс, так и элемент. В любом случае без использования CustomRenderer?Forms ListView index index

ListView listView = new ListView 
{ 
    HasUnevenRows = true, 

    // Source of data items. 
    ItemsSource = DataManager.GetPeople(), 

    ItemTemplate = new DataTemplate(() => 
    { 

     // Create views with bindings for displaying each property. 
     Label nameLabel = new Label(); 
     nameLabel.SetBinding(Label.TextProperty, "Name"); 
     nameLabel.TextColor = Color.White; 

     var relativeLayout = new RelativeLayout {};  

     var webImage = new Image { Aspect = Aspect.AspectFill }; 
     image.HeightRequest = 200; 
     image.Source = ImageSource.FromFile(Path.Combine(path, "/people/263/1.jpg")); 
     relativeLayout.Children.Add(image,Constraint.Constant(0),Constraint.Constant(0)); 

     relativeLayout.Children.Add(nameLabel, 
      Constraint.RelativeToParent((parent) => { 
       return parent.Width/2 - nameLabel.Width/2; 
      }), 
      Constraint.RelativeToParent((parent) => 
      { 
       return parent.Height - 20; 
      })); 

     // Return an assembled ViewCell. 
     var viewCell = new ViewCell 
     { 
      View = relativeLayout 
     }; 
     viewCell.Height = 200; 
     relativeLayout.HeightRequest = 200; 
     return viewCell; 
    }) 
}; 

ответ

3

"элемент" является ViewCellBindingContext.

«Индекс» - это позиция элемента в ItemsSource. Если ваш ItemsSource установлен в List<T>, вы можете просто использовать IndexOf(). Если это истинный IEnumerable(), вам нужно быть немного умнее. Тупой способ (ok для коротких списков) будет:

ItemsSource.ToList().IndexOf (BindingContext); 
+0

Но если я не ошибаюсь, вы не можете получить доступ к ItemsSource внутри DataTemplate. –

+0

Также в DataTemplate в примере BindingContext всегда имеет значение null ... довольно странно .. –

+0

это даже возможно на xaml? – batmaci

2

Это можно сделать с помощью конвертера. Вы можете увидеть из приведенного ниже примера, как получить доступ к элементу BindingContext (значение) и индексу, передав ListView в качестве ссылки. Вы можете использовать конвертер для создания своего пути изображения и привязки его к источнику изображения.

public class ImageSourceIndexConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null || parameter == null) return Color.White; 
     var index = ((ListView) parameter).ItemsSource.Cast<object>().ToList().IndexOf(value); 
     return ImageSource.FromFile(Path.Combine(path, "/people/"+index+"/1.jpg")); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Затем назовите ваш ListView и передать его в качестве параметра с помощью й: Ссылка

<ListView x:Name="PeopleListView" ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson, Mode=TwoWay}"> 
<ListView.ItemTemplate> 
    <DataTemplate> 
    <ViewCell> 
     <Grid> 
     <Image Source={Binding .,Converter={StaticResource StripedBackgroundIndexConverter}, ConverterParameter={x:Reference PeopleListView}}" /> 
     </Grid> 
    </ViewCell> 
    </DataTemplate> 
</ListView.ItemTemplate> 

+0

как Связывание. работа и какова «ценность», ожидаемая в конвертере? ваш подход выглядит хорошо для меня, но для меня всегда значение null. это должен быть текущий элемент списка? – batmaci

+0

Очень приятно. Я использовал вашу технику, чтобы сделать чередующуюся строку backcolor между прозрачной и полупрозрачной. –

0

Хорошей техники. Короткий ответ не позволит мне поделиться кодом. Я использовал вашу технику для чередования рядов прозрачных и полупрозрачных.

public class AlternatingHighlightColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
    Color rowcolor = Color.Transparent; 
     if (value == null || parameter == null) return Color.White; 
     var index = ((ListView)parameter).ItemsSource.Cast<object>().ToList().IndexOf(value); 
     if (index % 2 == 0) 
     { 
      rowcolor = Color.FromHex("#55FFFFFF"); 
     } 
     return rowcolor; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
}