【问题标题】:Conditional formating of a TextBlock within a Listbox’s DataTemplateListbox DataTemplate 中 TextBlock 的条件格式
【发布时间】:2013-03-26 16:33:25
【问题描述】:

这是我的第一个 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}" />

【问题讨论】:

  • 我看不到您的 ListBox 从哪里获取数据。

标签: wpf xaml


【解决方案1】:

正如@HighCore 提到的不确定您在哪里设置ListBox 的源,但如果您的绑定工作在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>

但无论如何,您还将TextBlock 中的Priority 属性与PriorityStyle 绑定到Text。所以你也可以这样做:

<Style x:Key="PriorityStyle"
       TargetType="TextBlock">
  <Setter Property="Foreground"
          Value="Black" />
  <Style.Triggers>
    <Trigger Property="Text"
             Value="High">
      <Setter Property="Foreground"
              Value="Red" />
    </Trigger>
  </Style.Triggers>
</Style>

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

【讨论】:

  • 您能否详细说明为什么这比在 ListBox 上设置 ItemsSource 更可取?我原以为做类似 会更容易(稍微短一些),更清晰(首先要看的是 itemssource 而不是样式!)并且在概念上更正确(我可以想象一下在未来的更新中更改绑定到列表框的集合,而不必手动更改样式中的每个绑定属性。
  • 也许我不够清楚,正如我在答案开头用给定信息所说的那样,我不确定列表框的来源设置在哪里。在列表框 xaml 中设置项目源应该是首选。说明这一点,我也没有在 Style 中设置任何项目源。只是建立在 OP 对 ListBoxItem 样式中的 DataTrigger 的评论工作正常,因此建议使用它的 DataContext
  • 绑定实际上是在运行时使用 RequestListBox.ListBox.ItemsSource = response.getListValues;
【解决方案2】:

我发现了我的问题的真正问题。这实际上不是绑定问题,而是样式问题。

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

因此,感谢 Viv 指出了正确的方向以及出色的“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}" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2017-11-07
    • 1970-01-01
    相关资源
    最近更新 更多