首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得ListViewItem的索引?

如何获得ListViewItem的索引?
EN

Stack Overflow用户
提问于 2018-10-15 11:23:58
回答 1查看 1.2K关注 0票数 0

我有一个使用集合源的列表视图,并希望根据其在列表中的索引是否匹配视图模型中的值来设置ListViewItems的背景色。为此,我将listVeiwItem的背景绑定到ViewModel中的值,并使用转换器确定背景颜色。为此,需要将ListViewItem的索引传递给转换器。如何使用XAML获取索引?

下面是ListView使用的数据模板的XAML:

代码语言:javascript
复制
<DataTemplate x:Key="ILMemberTemplate">
    <StackPanel Orientation="Horizontal" Background="{Binding Path=ListIndex, Mode=OneWay, Converter={StaticResource ParticipantBackground}, ConverterParameter={???}}">
        <TextBlock
            Width="200"
            TextAlignment="Left"
            Foreground="{Binding Path=IsPC, Mode=OneWay, Converter={StaticResource ParticipantColour}}"
            Text="{Binding Path=Name, Mode=OneWay}"/>
        <TextBlock
            Width="40"
            TextAlignment="Center"
            Foreground="{Binding Path=IsPC, Mode=OneWay, Converter={StaticResource ParticipantColour}}"
            Text="{Binding Path=Initiative, Mode=OneWay}"/>
    </StackPanel>
</DataTemplate>
EN

回答 1

Stack Overflow用户

发布于 2018-10-15 14:29:48

无法在XAML中获取索引并将其作为ConverterParameter传递。这是不可能的但是您可以使用多个转换器并绑定到ListIndex和父ListViewItem容器,例如:

代码语言:javascript
复制
class MultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var listIndex = values[0];
        //...
        ListViewItem item = value as ListViewItem;
        ListView lv = FindParent<ListView>(item);
        ICollectionView view = lv.ItemsSource as ICollectionView;
        IEnumerator e = view.GetEnumerator();
        int index = 0;
        while (e.MoveNext())
        {
            if (Equals(item.DataContext, e.Current))
                return index;
            else
                index++;
        }

        //return some brush based on the indexes..
    }

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

    private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
    {
        var parent = VisualTreeHelper.GetParent(dependencyObject);

        if (parent == null) return null;

        var parentT = parent as T;
        return parentT ?? FindParent<T>(parent);
    }
}

XAML:

代码语言:javascript
复制
<DataTemplate x:Key="ILMemberTemplate">
    <StackPanel Orientation="Horizontal">
        <StackPanel.Background>
            <MultiBinding Converter="{StaticResource multiConverter}">
                <Binding Path="ListIndex" />
                <Binding Path="." RelativeSource="{RelativeSource AncestorType=ListViewItem}" />
            </MultiBinding>
        </StackPanel.Background>
        <!-- ... -->
    </StackPanel>
</DataTemplate>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52815670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档