转换为样式的绑定数据

时间:2012-01-06 20:35:20

标签: wpf xaml

看不到穿过森林的树木。 尝试一个简单的数据绑定,我想用转换器格式化值。 (在此转换器示例中,不显示0的数字数据。)

资源:

    <conv:FormattingConverter x:Key="FormattingConverter"/>
    <Style x:Key="EGTSTextBoxInt" TargetType="TextBox">
        <Setter Property="Background" Value="{StaticResource CC_BACKGROUND}" />
        <Setter Property="Foreground" Value="{StaticResource CC_FOREGROUND}" />
        <Setter Property="FontFamily" Value="{StaticResource DefaultFont}" />
        <Setter Property="FontSize" Value="{StaticResource DefaultFontSize}" />
        <Setter Property="FontWeight" Value="Normal" />
        <Setter Property="FontStyle" Value="Normal" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="VerticalAlignment" Value="Center"
        <Setter Property="HorizontalAlignment" Value="Center" />
        <Setter Property="HorizontalContentAlignment" Value="Center" />
        <Setter Property="IsReadOnly" Value="True" />
    </Style>

文本框:

    <TextBox Name="Bill_Item"
             Grid.Column="6"
             MinWidth="46"
             MinHeight="23"
             Style="{StaticResource EGTSTextBoxInt}"
             Text="{Binding Path=Item, Mode=TwoWay,
                    Converter={StaticResource FormattingConverter},
                    ConverterParameter=\{0:G\}}" />

我想要做的是将样式中嵌入的Converter代码嵌入,这样我就不必在每个Text =行中拼出它。

在XAML后面添加代码以执行此操作不是一种选择!
我正在寻找一种纯XAML方法。

我仍在努力了解样式中某些事情是如何完成的。

布赖恩

3 个答案:

答案 0 :(得分:0)

TextBox的Text属性与数据有关。 Style属性与数据的外观有关。将转换器附加到样式是没有意义的。

编辑:我想我现在正在试图说些什么。您希望在一个位置Text="{Binding Path=Item}"<Setter Property="Text" Value="~somehow get the converter in here and have it applied to the existing text property which is bound to Items~" />

正如mydogisbox所提到的,我不认为你可以在这两个地方把这些想法分开。

答案 1 :(得分:0)

Converters用于将一个值转换为另一个值,因此如果没有正在转换的值,就无法使用它们

但是,您可以在绑定中使用StringFormat来格式化值而无需转换器

<TextBox Text="{Binding Path=Item, StringFormat=G}" />

你也可以创建一个继承自Binding类的类并设置默认的StringFormat,虽然我觉得这比它的价值更麻烦

<TextBox Text="{local:NumberBinding Path=Item}" />

如果您使用的是标签而不是TextBox,则可以将样式设定器应用于ContentStringFormat,这会将格式应用于标签的Content

<Style TargetType="{x:Type Label}">
    <Setter Property="ContentStringFormat" Value="G" />
</Style>

答案 2 :(得分:0)

有几种方法可以做到这一点 但在你开始之前:

  • 很重
  • 你的情况完全无用

1)定义自定义标记扩展
我们的想法是继承Binding标记扩展,允许您编写Text ="{Binding SomeProperty}" 你可以找到一个自己绑定here的人的例子 此解决方案不允许您将该功能放入样式中。

2)定义附加属性
这将修改控件的默认属性的绑定(在您的情况下,Text是TextBox的默认属性,因为您可以执行<TextBox>my text</TextBox>),以便自动使用所需的转换器。
这实际上允许您将此附加属性设置为样式。然而,这是非常糟糕的做法。这是一个很糟糕的魔术弦。

3)不要这样做,只是不要这样做。
每次都写下转换器。