Триггеры данных строк в сетке WPF

У меня есть ListBox со стилем. Этот стиль размещает ListBox с макетом из 3 столбцов на основе Grid. Сама сетка содержит элемент Image и два элемента TextBlock. Пока все работает нормально. Теперь я хочу создать триггер, который меняет форматирование и содержимое столбцов.

В настоящее время мне удалось установить триггеры на TextBlocks в сетке, которая работает нормально. См. следующий код

        <Style TargetType="ListBox" x:Key="strechedItemStyle">
        <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <Grid>
                            <Grid.Resources>

                            <Style x:Key="txtActive"  TargetType="TextBlock">
                                <Style.Triggers>
                                    <Trigger Property="Grid.Column" Value="0"></Trigger>
                                    <DataTrigger Binding="{Binding Path=IsActive}" Value="True">
                                        <Setter Property="FontWeight" Value="Bold"/>
                                        <Setter Property="Text" Value="(Active)"/>
                                    </DataTrigger>

                                    <DataTrigger Binding="{Binding Path=IsActive}" Value="False">
                                        <Setter Property="FontWeight" Value="Normal"/>
                                        <Setter Property="Text" Value=""/>
                                    </DataTrigger>

                                </Style.Triggers>
                            </Style>
                        </Grid.Resources>
                            <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                        <Image Source="../Images/copy.png" Height="16" Width="16"  HorizontalAlignment="Left" Grid.Column="0" Margin="2 0 5 0" />
                        <TextBlock Style="{StaticResource txtActive}" Text="{Binding Path=Name}" HorizontalAlignment="Left" Name="EnvName"  Grid.Column="1"/>
                        <TextBlock Style="{StaticResource txtActive}"  Name="Active" HorizontalAlignment="Right" Margin="0 0 5 0" Grid.Column="2">
                        </TextBlock>
                    </Grid>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

Но мне не очень нравится такой подход к стилю каждого столбца, особенно потому, что я изменяю содержимое столбца, а не сам столбец, или это неправильное мышление? Что делать, если я не знаю содержимого столбца?

Я бы предпочел иметь один триггер в сетке, то есть изменение Font-Weight для всей строки.

В качестве альтернативы: есть ли способ иметь триггер для отдельных столбцов сетки, а не для их содержимого?


person Dr.Elch    schedule 19.11.2011    source источник


Ответы (1)


Если вы хотите установить шрифт с одним триггером в стиле сетки, вам просто нужно сделать это:

<Grid.Style>
    <Style TargetType="Grid">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsActive}" Value="True">
                <Setter Property="TextBlock.FontWeight" Value="Bold"/>
                <Setter Property="TextBlock.Text" Value="(Active)"/>
        </DataTrigger>
        </Style.Triggers>
    </Style>
</Grid.Style>
person MaRuf    schedule 20.11.2011
comment
Спасибо, это позволит мне изменять сетку построчно. FontWeight применяется, но значение TextBlock.Text не изменяется. Я должен установить это изменение явно для TextBlock. - person Dr.Elch; 21.11.2011
comment
Вы правы, и, честно говоря, я не знаю почему :) Вы можете изменить свое дерево и поставить (активный) ярлык, который будет появляться/исчезать. - person MaRuf; 21.11.2011