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が言及したように、ソースの設定がどこにあるかはわかりませんが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>

しかし、とにかく、あなたのバインディングPriorityプロパティもwithにあります。したがって、次のこともできます。TextTextBlockPriorityStyle

<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には含めませんでした。私はテキストブロックに「フォアグラウンド」属性を含めていましたが、この最後の属性は実際に私のスタイル属性をオーバーライドしていました。それを削除し、スタイルセッターに「デフォルトのフォアグラウンド」値を含めることが答えでした。初心者の間違い。

ですから、正しい方向を指摘し、素晴らしい「RelativeSource」の例を示してくれたVivに敬意を表します。そして、私の悪い質問、ここで学んだ教訓をもう一度申し訳ありません。

    <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 に答える