Стилизация отдельных ячеек в виде списка - PullRequest
0 голосов
/ 01 мая 2011

В интернете я нашел много примеров оформления полного столбца или полной строки в виде списка.

Мне нужно иметь возможность динамически стилизовать отдельные ячейки в просмотре списка. Как я могу получить доступ к свойствам отдельных элементов подряд?

Ответы [ 2 ]

2 голосов
/ 01 мая 2011

Если у вас есть конечное число свойств в ваших объектах данных, которые вы хотите использовать для оформления ваших элементов, вы можете создавать шаблоны данных и стили и использовать триггеры данных для переключения между ними.Я использовал что-то вроде этого, чтобы изменить внешний вид объектов данных в списке, основываясь на том, являются ли они «активными / неактивными», и создать свернутую / развернутую версию объекта в зависимости от того, выбран он или нет.

Вы также можете использовать конвертеры (встроенные или пользовательские), чтобы легко получить некоторые эффекты.Например, я использовал встроенный конвертер логических значений в видимости, чтобы скрыть / показать поле со списком / текстовый блок в моем TaskSelectedTemplate на основе элемента IsActive объекта.

<DataTemplate x:Key="TaskSelectedTemplate">
    <Grid Margin="4">
        ...
        <Border Grid.Row="0" Grid.Column="0" Grid.RowSpan="4" Margin="0 0 4 0"
                BorderThickness="0" 
                CornerRadius="2">
            <Border.Background>
                <MultiBinding Converter="{StaticResource ActiveToColor}">
                    <Binding Path="."/>
                    <Binding Path="IsActive"/>
                    <Binding Path="IsPaused"/>
                </MultiBinding>
            </Border.Background>
        </Border>

        <StackPanel Grid.Row="0" Grid.Column="1"
                    Orientation="Horizontal"
                    Margin="0 2">
            <ComboBox ItemsSource="{Binding Source={StaticResource TaskTypes}}"
                      SelectedItem="{Binding Type}"
                      Text="{Binding Type}"
                      Visibility="{Binding IsActive, Converter={StaticResource BoolToVis}}"/>
            <TextBlock Text="{Binding Type}"
                       FontWeight="Bold"
                       Visibility="{Binding IsActive, Converter={StaticResource InvBoolToVis}}"/>
            <TextBlock Text=" task"/>
        </StackPanel>
        ...
    </Grid>
</DataTemplate>

<DataTemplate x:Key="TaskNotSelectedTemplate">
    <Grid Margin="4">
        ...
        <Border Grid.Row="0" Grid.Column="0" Grid.RowSpan="4" Margin="0 0 4 0"
                BorderThickness="0" 
                CornerRadius="2">
            <Border.Background>
                <MultiBinding Converter="{StaticResource ActiveToColor}">
                    <Binding Path="."/>
                    <Binding Path="IsActive"/>
                    <Binding Path="IsPaused"/>
                </MultiBinding>
            </Border.Background>
        </Border>

        <TextBlock Grid.Row="0" Grid.Column="1"
                   Text="{Binding Type}"/>
        <TextBlock Grid.Row="0" Grid.Column="2"
                   TextAlignment="Right">
                <Run Text="{Binding Length.TotalMinutes, StringFormat='0', Mode=OneWay}"/>
                <Run Text=" min"/>
            </TextBlock>
        <TextBlock Grid.Row="0" Grid.Column="3"
                   TextAlignment="Right">
                <Run Text="{Binding TimesPerformed, Mode=OneWay}"/>
                <Run Text=" tasks"/>
            </TextBlock>            
    </Grid>
</DataTemplate>

<Style x:Key="ContainerStyle" TargetType="{x:Type ListBoxItem}">
    <!--this part changes the selected item highlight color-->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Border Name="Border">
                    <ContentPresenter />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter TargetName="Border" 
                                Property="Background" Value="#2000BFFF">
                        </Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <!--this part causes selected task to expand-->
    <Setter Property="ContentTemplate" Value="{StaticResource TaskNotSelectedTemplate}"/>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="ContentTemplate" Value="{StaticResource TaskSelectedTemplate}"/>
        </Trigger>
    </Style.Triggers>
</Style>

Для более сложных сценариев:Вы можете посмотреть на DataTemplateSelector .Я никогда не использовал его, но кажется, что он может быть идеальным, если у вас есть много шаблонов данных для жонглирования.

0 голосов
/ 01 мая 2011

Вообще говоря, вам это не нужно.Предполагая, что вы используете GridView, вы сможете использовать CellTemplate или CellTemplateSelector ваших GridViewColumn s.

Если вы действительно хотите получить доступ к определенным ячейкам, я думаю, что нет чистого способавам лучше использовать DataGrid (из набора инструментов .Net 4 или WPF для .Net 3.5).С этим вы можете сделать что-то вроде этого:

((TextBlock)datagrid.Columns[1].GetCellContent(m_specificItem)).Background = Brushes.Red
...