2010-10-02 8 views
0

Je voudrais lier l'index z des éléments de la zone de liste à leur index.Comment puis-je lier avec l'index d'un ListBoxItem

Idéalement, nous aurions

<Style TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="Panel.ZIndex" 
      Value="{Binding RelativeSource={RelativeSource Self}, Path=-Index}" /> 
    <!-- ... --> 

Cependant, la zone de liste élément n'a pas une propriété d'index.

je peux penser à un certain nombre de solutions folles, mais rien de simple et élégant.

Tout preneur?

Répondre

2

Il n'y a pas de propriété Index, mais de toute façon "-Index" ne serait pas un chemin valide ... vous auriez toujours besoin d'un convertisseur pour annuler la valeur. Donc, ce que vous pouvez faire est de créer un convertisseur qui récupère l'index de la ItemContainerGenerator

public class ItemContainerToZIndexConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var itemContainer = (DependencyObject)value; 
     var itemsControl = FindAncestor<ItemsControl>(itemContainer); 
     int index = itemsControl.ItemContainerGenerator.IndexFromContainer(itemContainer); 
     return -index; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 

    public static T FindAncestor<T>(this DependencyObject obj) where T : DependencyObject 
    { 
     var tmp = VisualTreeHelper.GetParent(obj); 
     while (tmp != null && !(tmp is T)) 
     { 
      tmp = VisualTreeHelper.GetParent(tmp); 
     } 
     return (T)tmp; 
    } 
} 


<Style TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="Panel.ZIndex" 
      Value="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource zIndexConverter}}" /> 
    <!-- ... -->