更改TargetNullValue的TextBlock样式

时间:2012-03-02 09:58:52

标签: silverlight xaml silverlight-5.0

如果bound属性的值为null,我想更改TextBlock的样式。我已经为要显示的TextBlock的TargetNullValue指定了一个值,但是我希望以一种替代风格显示它。我怎么能这样做。

我目前的解决方案是使用两个TextBlocks并控制两者的可见性,以在原始样式和替代样式之间切换。但是这个解决方案不可行,因为我需要复制每个TextBlock,以显示替代版本。

当前解决方案:

<TextBlock Visibility="{Binding MyText, Converter={StaticResource nullToVisibilityConverter}}"
           FontSize="20"
           Foreground="Black"
           Text="{Binding MyText}" />

<TextBlock Visibility="{Binding MyText, Converter={StaticResource nullToVisibilityConverter}}"
           FontSize="20"
           FontStyle="Italic"
           Foreground="Gray"
           Text="None" />

需要解决方案:

<TextBlock FontSize="20"
           Foreground="Black"
           Text="{Binding MyText, TargetNullValue='None'}" />

<!-- plus any styles, templates or triggers, to change style of TextBlock for TargetNullValue -->

如何为TargetNullValue使用alternativ样式。欢迎任何使用样式,触发器或模板的解决方案。

1 个答案:

答案 0 :(得分:1)

注意:这适用于WPF,您可能必须转换与SL5.0不完全相关的任何内容。

最简单的解决方案(除非此要求无处不在)是为每个与文本块绑定相同属性的实例创建特定样式,检查Null并在那里设置属性。

此示例将很好地粘贴到Kaxaml中。

           

  <Style x:Key="tacoStyle" TargetType="TextBlock">
    <Style.Triggers>
      <DataTrigger Binding="{Binding Source={StaticResource taco}}" Value="{x:Null}">
        <Setter Property="Foreground" Value="Red"/>
      </DataTrigger>
    </Style.Triggers>
  </Style>
</StackPanel.Resources>
<TextBlock Style="{StaticResource tacoStyle}" Text="{Binding Source={StaticResource taco}, TargetNullValue='bacon'}"/>

当然,如果您需要更通用的解决方案,可以扩展TextBlock并添加一些逻辑来处理这个问题。

<StackPanel>
        <StackPanel.Resources>
            <x:NullExtension x:Key="taco"/>
            <Style x:Key="AltTacoStyle" TargetType="yourNS:ExtendedTextBlock">
                <Setter Property="Foreground" Value="Pink"/>
            </Style>
        </StackPanel.Resources>
        <yourNS:ExtendedTextBlock Text="{Binding Source={StaticResource taco}, TargetNullValue='bacon'}"
                                                                                AltStyle="{StaticResource AltTacoStyle}"
                                                                                AllowAltStyleOnNull="True"/>
    </StackPanel>

控制:

    public class ExtendedTextBlock : TextBlock {


    public static readonly DependencyProperty AllowAltStyleOnNullProperty =
        DependencyProperty.Register("AllowAltStyleOnNull", typeof (bool), typeof (ExtendedTextBlock), new PropertyMetadata(default(bool)));

    public bool AllowAltStyleOnNull {
        get { return (bool) GetValue(AllowAltStyleOnNullProperty); }
        set { SetValue(AllowAltStyleOnNullProperty, value); }
    }

    public static readonly DependencyProperty AltStyleProperty =
        DependencyProperty.Register("AltStyle", typeof (Style), typeof (ExtendedTextBlock), new PropertyMetadata(default(Style)));

    public Style AltStyle {
        get { return (Style) GetValue(AltStyleProperty); }
        set { SetValue(AltStyleProperty, value); }
    }

    static ExtendedTextBlock() {
        TextProperty.OverrideMetadata(typeof(ExtendedTextBlock), new FrameworkPropertyMetadata(default(string), PropertyChangedCallback));
    }

    private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) {
        var tb = (ExtendedTextBlock)dependencyObject;
        var binding = tb.GetBindingExpression(TextProperty);
        if (binding != null && binding.DataItem == null) {
            if (tb.AllowAltStyleOnNull)
                tb.Style = tb.AltStyle;
        }
    }
}

你需要充实一点才能做好生产准备,但你明白了。