如何绑定ListBoxItem的索引

bsint 发布于 2018-10-11 listbox 最后更新 2018-10-11 22:59 14 浏览

我想将列表框项目的z索引绑定到它们的索引。 理想情况下,我们会有

<Style TargetType="{x:Type ListBoxItem}">
    <Setter Property="Panel.ZIndex"
            Value="{Binding RelativeSource={RelativeSource Self}, Path=-Index}" />
    <!-- ... -->
但是,列表框项目不具有索引属性。 我可以想到一些疯狂的解决方案,但没有简单和优雅。 任何接受者?
已邀请:

stotam

赞同来自:

没有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}}" />
    <!-- ... -->

要回复问题请先登录注册