2014-03-13 18 views
14

Gibt es eine Möglichkeit, den Index des aktuellen ItemsControl Elements in WPF zu erhalten?Wie bekomme ich den Index des aktuellen ItemsControl Elements?

Zum Beispiel möchte ich, wie etwas tun:

<ItemsControl> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding current_index}"> 
      </TextBox> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

so dass nach diesem ersten TextBox Text zeigen "0", zweiten "1", dritte "2" ....

+0

möglich Duplikat [WPF Items der aktuelle ListItem Index in der Itemssource] (http://stackoverflow.com/questions/6511180/wpf-itemscontrol-the-current-listitem-index-in-the-itemssource) – har07

Antwort

25

Ich würde vorschlagen, Blick auf:

WPF ItemsControl the current ListItem Index in the ItemsSource

Es wird erläutert, wie sich um die Tatsache zu arbeiten, dass es keine in Index-Eigenschaft auf der Items gebaut ist.

EDIT:

Ich habe versucht, den folgenden Code:

<Window.Resources> 
    <x:Array Type="{x:Type sys:String}" x:Key="MyArray"> 
     <sys:String>One</sys:String> 
     <sys:String>Two</sys:String> 
     <sys:String>Three</sys:String> 
    </x:Array> 
</Window.Resources> 
<ItemsControl ItemsSource="{StaticResource MyArray}" AlternationCount="100" > 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex), 
       RelativeSource={RelativeSource TemplatedParent}, 
       StringFormat={}Index is {0}}"> 
      </TextBlock> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl > 

und ein Fenster mit drei Textblocks wie bekommen:

[Index is 0] 
[Index is 1] 
[Index is 2] 
+1

Für andere, die das finden, mag und benutze ich die Lösung von Saykor. Ich habe gehört, dass du dich nicht darauf verlassen kannst, dass AlternationCount immer bei Null beginnt. Fühlt sich an wie ein Hack. Verwenden Sie stattdessen einen Konverter und übergeben Sie ihm die Informationen, die benötigt werden, um den Index zu bestimmen. – Skychan

+1

@Skychan Können Sie weitere Argumente angeben, warum AlternationCount auf diese Weise unzuverlässig sein sollte? – Leonidas

6

Check this out

<ItemsControl ItemsSource="{Binding Items}" Name="lista"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock> 
         <TextBlock.Text> 
          <MultiBinding Converter="{StaticResource converter}"> 
           <Binding Path="."/> 
           <Binding ElementName="lista" Path="ItemsSource"/> 
          </MultiBinding> 
         </TextBlock.Text> 
        </TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

Converter wie folgt aussieht

public class conv : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     ObservableCollection<string> lista = (ObservableCollection<string>)values[1]; 
     return String.Concat(lista.IndexOf(values[0].ToString()), " ", values[0].ToString()); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Als Ergebnis enter image description here

+1

Beachten Sie, dass dies nur funktioniert, wenn die Ansicht genau mit der ursprünglichen Quelle übereinstimmt, d. H. Nicht zum Beispiel sortiert oder gefiltert wird. –

3

Hier ist, wie ich ItemIndex

<ItemsControl> 
     <ItemsControl.Resources> 
      <CollectionViewSource x:Key="ProductItems" Source="{Binding SelectedScanViewModel.Products}"> 
       <CollectionViewSource.SortDescriptions> 
        <componentModel:SortDescription PropertyName="ProductName" Direction="Ascending"/> 
       </CollectionViewSource.SortDescriptions> 
      </CollectionViewSource> 
     </ItemsControl.Resources> 
     <ItemsControl.ItemsSource> 
      <Binding Source="{StaticResource ProductItems}"/> 
     </ItemsControl.ItemsSource> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel HorizontalAlignment="Center"> 
        <TextBlock Text="{Binding ProductName}" HorizontalAlignment="Center" /> 
        <TextBox Name="txtFocus" Text="{Binding Qty}" MinWidth="80" HorizontalAlignment="Center" 
            behaviors:SelectTextOnFocus.Active="True"> 
         <TextBox.TabIndex> 
          <MultiBinding Converter="{StaticResource GetIndexMultiConverter}" ConverterParameter="0"> 
           <Binding Path="."/> 
           <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}" Path="ItemsSource"/> 
          </MultiBinding> 
         </TextBox.TabIndex> 
        </TextBox> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid Columns="{Binding SelectedScanViewModel.Products.Count}"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 

Und der Konverter:

public class GetIndexMultiConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     var collection = (ListCollectionView)values[1]; 
     var itemIndex = collection.IndexOf(values[0]); 

     return itemIndex; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException("GetIndexMultiConverter_ConvertBack"); 
    } 
} 

Auf diese Weise können Sie jede Art von Sammlung an die ItemSource binden und er wird zu ListCollectionView wechseln. Der Konverter wird also für verschiedene Sammlungsarten arbeiten.

xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
+0

Hier ist eine ähnliche alternative Lösung, die den ItemContainerGenerator verwendet, um den Index zu bestimmen. http://stackoverflow.com/questions/7290147/is-possible-to-get-a-index-from-a-item-in-a-list – Skychan

+0

Ich denke, dieser Ansatz wird nicht korrekt funktionieren: IndexOf verwendet Equals Wenn die Quellensammlung Duplikate enthält (z. B. zwei gleiche Zeichenfolgenwerte), gibt IndexOf immer das erste Element zurück. – aderesh

+0

Ich denke, eine Lösung, die ItemContainerGenerator verwendet, ist besser. Vielen Dank. – aderesh

Verwandte Themen