Изменить цвет фона ListViewItem с помощью индекса, указанного свойством - PullRequest
0 голосов
/ 11 февраля 2019

Я новичок в WPF, у меня есть свойство, которое определяет int, который является индексом элемента для изменения цвета фона в ListView, но меняет цвет фона всех ListViewItem,вот мой код:

<ListView AlternationCount="2147483647" x:Name="listView1" HorizontalAlignment="Left" Height="295" Margin="10,10,0,0" VerticalAlignment="Top" Width="380" Padding="0" HorizontalContentAlignment="Center" BorderThickness="1" IsSynchronizedWithCurrentItem="False" SelectionMode="Single" ScrollViewer.CanContentScroll="True">
                    <ListView.ItemContainerStyle>
                        <Style TargetType="{x:Type ListViewItem}">
                            <Setter Property="ContextMenu" Value="{StaticResource ListViewItemContexMenuKey}"/>

                            <Style.Triggers>
                                <DataTrigger Value="True">
                                    <DataTrigger.Binding>
                                        <MultiBinding Converter="{StaticResource IndexConverter}">
                                            <Binding Path="AlternationIndex" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}"/>
                                            <Binding Path="TargetIndex" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Window}"/>
                                        </MultiBinding>
                                    </DataTrigger.Binding>
                                    <Setter Property="Background" Value="#FFFF7171"/>
                                </DataTrigger>
                            </Style.Triggers>

                        </Style>
                    </ListView.ItemContainerStyle>
   </ListView>

Здесь IndexConverter

public class IndexConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        int index = (int)values[0];
        int targetIndex = (int)values[1];

        Console.WriteLine($"Index: {index}, TargetIndex: {targetIndex}");
        return index == targetIndex;
    }

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

В IndexConverter.Convert индекс локальной переменной равен AlternationIndex и всегда возвращает 0.

Я не понимаю, почему это поведение при использовании триггера работает корректно, но вы не можете связать с помощью триггера.

<Trigger Property="ItemsControl.AlternationIndex" Value="1">
        <Setter Property="Background" Value="#FFFF7171"/>
</Trigger>

1 Ответ

0 голосов
/ 12 февраля 2019

Как указывает @elgonzo, ItemsControl.AlternationIndex - это прикрепленное свойство , которое следует связать следующим образом:

<Binding Path="(ItemsControl.AlternationIndex)" 
         RelativeSource="{RelativeSource Self}"/>

Обратите внимание на круглые скобки вокруг пути.

...