2014-10-15 2 views
2

방금 ​​Xamarin.Forms를 사용하기 시작했으며 ListView에 대한 질문이 있으며 웹에서 답변을 찾을 수 없습니다. 아래 코드에서, ItemTemplate에서 요소의 인덱스를 얻거나 셀에 표시된 ItemSource에 액세스하는 방법이 필요합니다. 표시된 이미지의 경로를 작성해야합니다. 인덱스와 요소를 둘 다 가질 수 있다면 더 좋습니다. CustomRenderer를 사용하지 않고 어떤 방법 으로든?Forms ListView 행 인덱스

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에있는 요소의 위치입니다. ItemsSourceList<T>으로 설정된 경우 IndexOf() 만 사용할 수 있습니다. 사실 IEnumerable() 인 경우 조금 더 똑똑해야합니다. 바보 같은 방법 (짧은 목록에 대한 확인)은 다음과 같습니다 :

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

하지만 내가 틀리지 않으면 DataTemplate 내부의 ItemsSource에 액세스 할 수 없습니다. –

+0

또한 예제의 DataTemplate에서 BindingContext는 항상 null입니다 ... 매우 이상합니다 .. –

+0

xaml에서도 가능합니까? – batmaci

2

이것은 변환기를 사용하여 수행 할 수 있습니다. 아래 예제에서 BindingContext (value) 요소에 액세스하고 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에 이름을 지정하고 X를 사용하여 매개 변수로 전달합니다

<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

아주 좋습니다. 나는 당신의 기술을 사용하여 투명과 반투명 사이에 행의 배경색을 번갈아 가며 사용했다. –

0

멋진 기술을 참조. 짧은 회신을 보내면 코드를 공유 할 수 없습니다. 나는 transparant와 semi-transparent의 교대 행을 만들기 위해 당신의 기술을 사용했습니다.

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(); 
    } 
}