Изменить цвет переднего плана элемента ListView только в одном столбце - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть список объектов и ListView, где я отображаю этот список. Такой объект имеет некоторые свойства, они привязаны к столбцам ListView.

<ListView x:Name="_fileNameList" FontSize="12" SourceUpdated="_fileNameList_SourceUpdated" TargetUpdated="_fileNameList_TargetUpdated">
    <ListView.View>
        <GridView x:Name="FileNameAttributes" >
            <GridViewColumn  Header="File Name"   Width="200" DisplayMemberBinding="{Binding fileName}"/>
            <GridViewColumn  Header="Size" Width="80" DisplayMemberBinding="{Binding size}"/>
            <GridViewColumn  Header="Date" Width="80" DisplayMemberBinding="{Binding date}"/>
            <GridViewColumn  Header="Time" Width="80" DisplayMemberBinding="{Binding time}"/>
            <GridViewColumn  Header="New Name" Width="300" DisplayMemberBinding="{Binding newFileName}"/>
        </GridView>
    </ListView.View>
</ListView>

Эта часть работает нормально.

Теперь я хочу изменить цвет переднего плана столбца newFileName в одной строке, но только если он равен 'fileName' в той же строке.

Могу ли я сделать это в XAML или мне нужно перейти к коду, стоящему за файлом?

Мне бы лучше, если бы я мог справиться с этим в XAML, потому что я думаю, что это чисто проектная проблема, но я понятия не имею, с чего начать и где это поставить (могу ли я выполнить сравнения строк в XAML?)

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

Может кто-нибудь дать мне представление, как я могу решить это?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2012

Вы можете сделать это, используя MultiBinding и MultiConverter. Вам нужно написать MultiConverter, который принимает fileName и newFileName и возвращает true, если они равны

<ListView x:Name="_fileNameList" FontSize="12" SourceUpdated="_fileNameList_SourceUpdated" TargetUpdated="_fileNameList_TargetUpdated">
            <ListView.View>
                <GridView x:Name="FileNameAttributes" >
                    <GridViewColumn  Header="File Name"   Width="200" DisplayMemberBinding="{Binding fileName}"/>
                    <GridViewColumn  Header="Size" Width="80" DisplayMemberBinding="{Binding size}"/>
                    <GridViewColumn  Header="Date" Width="80" DisplayMemberBinding="{Binding date}"/>
                    <GridViewColumn  Header="Time" Width="80" DisplayMemberBinding="{Binding time}"/>
                    <GridViewColumn  Header="New Name" Width="300">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding newFileName}">
                                    <TextBlock.Style>
                                        <Style>
                                            <Setter Property="TextBlock.Foreground" Value="Black"></Setter>
                                            <Style.Triggers>
                                                 <DataTrigger Value="True">
                                                     <DataTrigger.Binding>
                                                         <MultiBinding Converter="{StaticResource EqualityConverter}">
                                                             <Binding Path="newFileName"></Binding>
                                                             <Binding Path="fileName"></Binding>
                                                         </MultiBinding>
                                                     </DataTrigger.Binding>
                                        <Setter Property="TextBlock.Foreground" Value="Red"></Setter>
                                    </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </TextBlock.Style>
                                </TextBlock>

                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

Код для EqualityConverter следующий:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values[0].ToString().Equals(values[1].ToString()))
                return true;
            return false;
        }
2 голосов
/ 17 февраля 2012

Если вы хотите изменить стиль любого элемента wpf, вы должны использовать Стиль. если вы хотите, чтобы это произошло при некоторых условиях, вы должны использовать Style.Triggers. если ваши условия относятся к обязательной информации, вы должны использовать DataTrigger. И если XATL-обработчик данных не может справиться с вашим состоянием, добавьте конвертер.

, поэтому я бы посоветовал вам взять в своем GridViewColum.Style источник данных и мультиконвертер с двумя параметрами: filename и newfilename. вернуть true, если то же самое, иначе false.

что-то вроде этого:

<DataTrigger Value="True">
  <DataTrigger.Binding>
    <MultiBinding Converter="{StaticResource MyFileNameCheckConverter}">
        <Binding Path="fileName"/>
        <Binding Path="newFileName"/>
    </MultiBinding>
  </DataTrigger.Binding>
  <Setter Property="Foreground" Value="Red"/>
 </DataTrigger>

Преобразователь

public class FileNameCheckConverter: IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var filename = (string)values[0];
        var newfilename = (string)values[1];

        return filename==newfilename;
    }

    ...
}

ps: не забудьте также установить "нормальный" передний план в вашем стиле! в противном случае триггер не будет работать.

pps: код написан от руки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...