Listbox DataTemplate中的TextBlock的条件格式

时间:2013-03-25 19:58:24

标签: wpf xaml

这是我的第一个wcf&我遇到了一些基本的XAML概念。

“PriorityStyle”中的DataTrigger / Binding无法正常工作。我想这是因为背景问题,但环顾四周,我无法找到答案。

<UserControl … >

<UserControl.Resources>

    <Style x:Key="PriorityStyle" TargetType="TextBlock" >
        <Style.Triggers>
            <DataTrigger Binding="{Binding Priority}" Value="High">
                <Setter Property="Foreground" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

    <DataTemplate x:Key="ItemTemplate">
        <StackPanel Margin="3">
            ...
            <DockPanel>
                <TextBlock Name="Priority" Text="{Binding Priority}" Foreground ="#014f7c" Style="{StaticResource PriorityStyle}"/>
            </DockPanel>
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="SelectedTemplate">
        ...
    </DataTemplate>

    <Style TargetType="{x:Type ListBoxItem}" x:Key="ContainerStyle">
        <Setter Property="ContentTemplate" Value="{StaticResource ItemTemplate}" />
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="ContentTemplate" Value="{StaticResource SelectedTemplate}" />
            </Trigger>

            <!-- DataBinding work in this Context, But in Style I cannot use a TargetName -->
            <DataTrigger Binding="{Binding Priority}" Value="High">
                <Setter Property="Background" Value="DarkOrange"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

</UserControl.Resources>

<ListBox x:Name="ListBox" ItemContainerStyle="{StaticResource ContainerStyle}" />

2 个答案:

答案 0 :(得分:1)

正如@HighCore所说,不确定您为ListBox设置来源的位置,但如果您的约束适用于[{1}}的样式,则可以尝试解决方法

ListBoxItem

但是您<Style x:Key="PriorityStyle" TargetType="TextBlock" > <Setter Property="Foreground" Value="Black" /> <Style.Triggers> <DataTrigger Binding="{Binding DataContext.Priority, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="High"> <Setter Property="Foreground" Value="Red"/> </DataTrigger> </Style.Triggers> </Style> 的{​​{1}}属性也PriorityText TextBlock。所以你也可以这样做:

PriorityStyle

这样你甚至不需要遍历元素树的绑定

答案 1 :(得分:1)

我发现了问题的真正问题。事实上,这不是一个具有约束力的问题,而是一个风格问题。

我没有将它包含在原始XAML中,因为我做了一些不正确的清洁以使其更清晰。我在Textblock中包含了一个“Foreground”属性,最后一个属性确实覆盖了我的style属性。删除它并在样式设置器中包含“默认前景”值就是答案。初学者错了。

所以,向Viv表示赞赏,指出正确的方向&amp;对于漂亮的“RelativeSource”示例。对于我的坏问题再次感到抱歉,这是从这里学到的一课。

    <Style x:Key="PriorityStyle" TargetType="TextBlock" >
        <Setter Property="Foreground" Value="#6c6d6f" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding Priority}" Value="Critical">
                <Setter Property="Foreground" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

    <TextBlock Name="Summary" Text="{Binding _Summary}" Style="{StaticResource PriorityStyle}" />