【问题标题】:Binding Textblock Style/Converter绑定文本块样式/转换器
【发布时间】:2012-01-19 17:06:07
【问题描述】:

我有:

<TextBlock Text="{Binding OrderType}"/>

OrderType 是一个字符串,可能是 A、B、C、D。但我希望文本块在(A 或 B)时显示“是”,如果(C 或 D)时显示“否”,但希望前景色为绿色,如果 A,蓝色,如果 B,黄色,如果 C,红色,如果 D。最好的方法是什么?如果我使用转换器,样式触发器应该绑定到什么或者是否有更好的方法,我有点困惑。谢谢。

【问题讨论】:

    标签: wpf xaml data-binding mvvm


    【解决方案1】:

    您应该为此使用 IValueConverter:

    public class OrderTypeToYesNoConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
                if(value != null)
                {
                     string val = value.ToString();
                     if(val == "A" || val == "B")
                        return "YES"; 
                }
                return null;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
                throw new NotImplementedException();
        }
    }
    

    XAML

    <Window
        ..
        ..
        xmlns:converters="clr-namespace:NameSpace;assembly=Assembly">
    <Window.Resources>
        <converters:OrderTypeToYesNoConverter x:Key="OrderTypeToYesNoConverter"/> 
    </Window.Resources>
    
    <TextBlock Text="{Binding OrderType, Converter="{StaticResource OrderTypeToYesNoConverter}"/>
    

    【讨论】:

    • @H.B.好吧,反对它,但告诉我们为什么 =) 转换器方法非常可重用,这就是为什么我倾向于建议使用它们而不是触发器。
    • 转换器显然是为了转换,比如布尔到可见性。对于这种只有多种情况(如开关)的事情,转换器对我来说似乎是滥用。
    • @H.B.我刚刚展示了一个示例,但您可以使用“参数”参数使它们更通用。我见过人们通过它制作自己的自定义脚本语言,它大大减少了 XAML 代码。您还可以更好地进行调试!
    • 减少 XAML 没有内在价值,脚本语言是必要的,这完全违背了 XAML 的全部意义:声明性标记。
    • @H.B.我显然不是在谈论 XAML 之上的大量脚本语言。但是一个足够通用的转换器可以让您执行“A | B => YES, C | D => NO”在您提供的 XAML 中保存 18 行,并且不会重新发明 WPF。
    【解决方案2】:

    可以仅使用触发器来执行此操作,但有一些冗余:

    <TextBlock>
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding OrderType}" Value="A">
                        <Setter Property="Text" Value="YES" />
                        <Setter Property="Foreground" Value="Green" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding OrderType}" Value="B">
                        <Setter Property="Text" Value="YES" />
                        <Setter Property="Foreground" Value="Blue" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding OrderType}" Value="C">
                        <Setter Property="Text" Value="NO" />
                        <Setter Property="Foreground" Value="Yellow" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding OrderType}" Value="D">
                        <Setter Property="Text" Value="NO" />
                        <Setter Property="Foreground" Value="Red" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多