Изменить шаблон ListView CellTemplate в зависимости от состояния элемента - PullRequest
0 голосов
/ 06 мая 2011

У меня есть ListView, который имеет ObservableCollection в качестве ItemsSource и имеет несколько столбцов. Одним из них является столбец Состояние, который в зависимости от текущего состояния элемента отображает другое сообщение. В настоящее время это реализовано как базовая строка, и хотя она работает, она далеко не красивая и не удобная для пользователя. Я хочу иметь возможность варьировать вид вывода, чтобы он более точно соответствовал состоянию элемента.

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

Мой код (исключая множество других ошибок списка) выглядит следующим образом:

<ListView Name="itemsListView" ItemsSource="{Binding Source={StaticResource listingDataView}}" IsSynchronizedWithCurrentItem="True">
    ...
    <ListView.View>
         <GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Item Information">
             ...
             <GridViewColumn DisplayMemberBinding="{Binding Path=StatusMessage}" Width="283" Header="Status" HeaderContainerStyle="{StaticResource GVHeaderLeftAlignedStyle}" />
         </GridView>
    </ListView.View>
</ListView>

Да, элементы имеют жестко закодированное «Сообщение о состоянии», которое обновляется вместе с другими свойствами, которые действительно имеют отношение к коду, вызывая ужасное дублирование в другом месте моего кода. (И да, я знаю, что это далеко не красиво, но я тоже хочу улучшить это.) Это свойство будет называться ItemState, поскольку я не настолько креативен.

Итак, мой вопрос: как я могу изменить этот столбец, чтобы иметь наиболее подходящее отображение для данного состояния? Текстовые описания подходят для многих состояний, но некоторые из них довольно длинные и могут получить пользу от текста с индикатором выполнения помимо него, и, возможно, останется какое-то время. Другое государство получило бы выгоду от наличия гиперссылки, на которую можно нажать Другими словами, я думаю, что мне нужно как минимум 3 разных CellTemplates.

Я понимаю, что это довольно открытый вопрос, который в значительной степени страдает от ошибок проектирования кого-то (= меня), который имеет довольно небольшой опыт работы с WPF, но именно поэтому я надеюсь, что кто-то опытный может установить меня прямо с некоторый базовый код, прежде чем я сделаю еще худший беспорядок, чем я уже сделал. :)

1 Ответ

5 голосов
/ 06 мая 2011

Вы можете использовать триггеры для изменения содержимого ячейки, например,

<GridViewColumn Header="Status">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <ContentControl>
                <ContentControl.Style>
                    <Style TargetType="{x:Type ContentControl}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding StateItem.HasError}" Value="True">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <!-- Possibly create another contentcontrol which differentiates between errors -->
                                        <DataTemplate>
                                             <TextBlock Text="{Binding StateItem.Error}"
                                                        Foreground="Red"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>

                            <DataTrigger Binding="{Binding StateItem.HasError}" Value="False">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <Image Source="Images/Default.ico"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

Код становится немного сумасшедшим, но если вы продолжите его, но это способ сделать это.

Редактировать: Установщики должны установить ContentTemplate вместо Content, очевидно, иначе никакие новые элементы управления не могут быть созданы, и только одна строка показывает правильное содержимое, так как у содержимого может быть только один родительский элемент .

...