Как я могу связываться с индексом ListBoxItem - PullRequest
0 голосов
/ 02 октября 2010

Я бы хотел привязать z-индекс элементов списка к их индексу.

В идеале у нас будет

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

Однако элемент списка не имеетсвойство индекса.

Я могу придумать несколько сумасшедших решений, но ничего простого и изящного.

Любой желающий?

1 Ответ

2 голосов
/ 14 июня 2011

Нет свойства Index, но в любом случае "-Index" не будет допустимым путем ... вам все равно понадобится конвертер для отрицания значения. Итак, что вы можете сделать, это создать конвертер, который извлекает индекс из 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}}" />
    <!-- ... -->
...