2013-03-25 38 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}" />