WPF网格上的行数据触发器

本文关键字:数据 触发器 网格 WPF | 更新日期: 2023-09-27 18:15:09

我有一个样式的列表框。这个样式的ListBox基于Grid的3列布局。网格本身包含一个Image和两个TextBlock元素。到目前为止一切都很顺利。现在我想创建一个触发器来更改列的格式和内容。

目前我已经设法有触发器在网格内的textblock,这是工作良好。请看下面的代码

        <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。

或者:是否有一种方法如何在单个网格列上触发而不是它们的内容?

WPF网格上的行数据触发器

如果你想在网格样式上设置一个触发器的字体重量,你只需要这样做:

<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>