2013-03-25 34 views
1

这是我的第一个wcf &我遇到了一些似乎是基本XAML概念的麻烦。在列表框的DataTemplate中有条件地格式化TextBlock

不知何故“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}" /> 

+0

我看不到你的'ListBox'从哪里得到它的数据。 – 2013-03-25 20:06:40

回答

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> 

但是您也可以在TextBlockPriorityStyle之间绑定Priority属性到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> 

这种方式,你甚至不通过你的元素树需要结合穿越

+0

您可以详细说明为什么这会比ListBox上的ItemsSource更好吗?我会以为像ListBox ... ItemsSource = {Binding} />会更容易(稍短),更清晰(首先看看将是itemssource,而不是在一种风格!)和更概念上正确(我可以想象在未来的更新中改变绑定到列表框的集合,而不是必须手动更改样式中的每个绑定属性)。 – failedprogramming 2013-03-25 22:12:33

+0

也许我还不够清楚,正如我在回答的开头所述的给定信息,我不确定列表框的源设置在哪里。在listbox xaml中设置项目源应该是首选项。说明,我没有在Style中设置任何项目源。只是建立在他的DataTrigger的ListBoxItem风格的OP的评论工作正常,因此建议一个解决使用其DataContext – Viv 2013-03-25 23:32:54

+0

绑定实际上是在运行时使用 RequestListBox.ListBox.ItemsSource = response.getListValues; – VeV 2013-03-26 08:17:45

1

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

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

因此,对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}" />