无法在ListView / GridView中的TextBlock上应用触发器

时间:2014-04-28 16:37:41

标签: wpf xaml

无法在GridViewDataTemplate字段上应用Style。 我只需要根据其对象更改TextBlock的Forground。 如果在列表视图外拉这个文本块,它可以完美地工作。但在ListView内部它不起作用。

请告诉我如何解决此问题。

<ListView Margin="5,15,0,5" 
                      ItemsSource="{Binding}" Background="Transparent" Foreground="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" BorderThickness="0"
                       ScrollViewer.HorizontalScrollBarVisibility="Disabled">
                <ListView.Resources>
                    <Style TargetType="{x:Type GridViewColumnHeader}">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </Style>
                    <DataTemplate x:Key="DataColumnStyle" DataType="GridViewColumn.CellTemplate">
                        <StackPanel>
                            <TextBlock Text="{Binding}" Foreground="White" FontSize="16" TextWrapping="Wrap"/>
                        </StackPanel>
                    </DataTemplate>
                    <DataTemplate x:Key="StatusColumnStyle" DataType="GridViewColumn.CellTemplate">
                        <StackPanel>
                            <TextBlock Text="{Binding}" FontSize="16" TextWrapping="Wrap">
                                <TextBlock.Style>
                                    <Style TargetType="TextBlock">
                                        <Style.Triggers>
                                            <Trigger Property="Text"  Value="In Progress">
                                                <Setter Property="Foreground" Value="Black"/>
                                            </Trigger>
                                            <Trigger Property="Text" Value="Complete">
                                                <Setter Property="Foreground" Value="Green"/>
                                            </Trigger>
                                            <Trigger Property="Text" Value="Failed">
                                                <Setter Property="Foreground" Value="Red"/>
                                            </Trigger>
                                        </Style.Triggers>
                                    </Style>
                                </TextBlock.Style>
                            </TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListView.Resources>
                <ListView.View>
                    <GridView>
                        <GridViewColumn DisplayMemberBinding="{Binding Activity}" CellTemplate="{StaticResource DataColumnStyle}" x:Name="ActivityColumn"/>
                        <GridViewColumn DisplayMemberBinding="{Binding Status}" CellTemplate="{StaticResource StatusColumnStyle}" Width="100" x:Name="StatusColumn"/>
                    </GridView>
                </ListView.View>
            </ListView>

1 个答案:

答案 0 :(得分:0)

我相信如果您设置DisplayMemberBinding属性,CellTemplate属性将被忽略;如果您只想指定文字而不是模板,那么DisplayMemberBinding就可以了。

因此,您需要将代码更改为以下内容:

更改`DataTemplate&#39;中的Text绑定:

Text="{Binding}" => Text="{Binding Activity}"

DisplayMemberBinding

中删除ListView
<GridViewColumn DisplayMemberBinding="{Binding Activity}" CellTemplate="{StaticResource DataColumnStyle}" x:Name="ActivityColumn"/> => <GridViewColumn CellTemplate="{StaticResource DataColumnStyle}" x:Name="ActivityColumn"/>

大致是:                                                                                                                                     

 <!-- Your Code -->

<GridView>
    <GridViewColumn CellTemplate="{StaticResource DataColumnStyle}" x:Name="ActivityColumn"/>
    <GridViewColumn CellTemplate="{StaticResource StatusColumnStyle}" Width="100" x:Name="StatusColumn"/>
</GridView>

 <!-- Your Code -->

如果您查看DisplayMemberInfo的{​​{3}}信息(也是CellTemplate / CellTemplateSelector),您可以看到有一个优先顺序:

  

以下属性都用于定义内容和样式   列单元格的列表,并按其优先顺序列在此处,   从最高到最低:

DisplayMemberBinding

CellTemplate

CellTemplateSelector