1

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

4

2 回答 2

1

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

但无论如何,您的绑定Priority属性也必须TextTextBlockwith中。PriorityStyle所以你也可以这样做:

<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>

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

于 2013-03-25T20:42:17.420 回答
1

我发现了我的问题的真正问题。这实际上不是一个约束性问题,而是一个风格问题。

我没有将它包含在原始 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}" />
于 2013-03-26T08:33:25.000 回答