2012-01-06 80 views
1

无法通过森林看到树木。 尝试简单的数据绑定,我想用转换器格式化值。 (在这个转换器例子,数字数据是不显示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\}}" /> 

我想要做的就是嵌入在转换代码样式,以便我不必在每个Text =行中拼写出来。

在XAML后面添加代码以做任何事情都不是一种选择!
我在寻找纯粹的XAML方法。

我仍然试图掌握样式中某些事情是如何完成的。

布赖恩

+0

你不能在你的风格中拥有二传手的一部分。 I.E.你要么在样式中需要整个文本装订线,要么都不需要;你不能做一半。 – mydogisbox 2012-01-06 20:46:31

回答

0

有几种方法可以做到这一点。
但是,你甚至开始之前:

  • 这是重
  • 这是你的情况

1)完全无用的定义自定义标记扩展
的想法是从绑定继承标记扩展,允许你写Text ="{Binding SomeProperty}"
你可以找到一个自己制作绑定的人的例子here
这个解决方案不允许你把这个功能放在一个样式中。

2)定义的附加属性
将修改绑定控件的默认属性的(在你的情况下,文本是文本框的默认属性,你可以以用做<TextBox>my text</TextBox>)你想要的转换器,自动。
这实际上可以让你把这个附加属性设置为一种风格。然而,这是非常糟糕的做法。这是一个不错的魔术弦。

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

+0

有没有办法通过资源执行带参数的转换器(即全局更改为正在使用的格式) – BRisley 2012-01-06 21:49:27

+0

是,使其具有两个附加属性:一个是将控件标记为自动转换,另一个是设置参数,然后如果它是全局的,则将其作为隐式样式放入app.xaml – 2012-01-06 21:51:12

+0

将格式设置移动到标签并让转换器查找v从启动时加载的列表中获取标签的一部分(或者如果它获得了正确的格式命令,则使用它)。这使我们能够即时创建XAML,从一个位置改变格式,甚至可以在需要时支持将更改降低到用户级别。 – BRisley 2012-01-10 14:23:07

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提到,我不认为你可以在这样的两个地方拆分这些想法。

+0

这是关于数据的外观。当值为0或负数时,消隐为0的字段与改变背景大致相同。 – BRisley 2012-01-06 21:14:16

+0

这是你真的想要做什么? – epalm 2012-01-06 21:15:19

+0

并格式化数据(即以mm/dd/yyyy格式或日期/时间为单位的日期,单位为mm/dd/yyyy hh:mm A/P和货币为2位小数或浮点数到位数 – BRisley 2012-01-06 21:40:06

0

Converters是一个值转换成另一种价值,所以他们不能没有它们转换

但是您可以在绑定格式的值没有转换

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

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

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

如果你曾经与标签,而不是文本框时,您可以应用样式设置器,ContentStringFormat,将格式应用于Label的Content

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

字符串格式问题就是它在0或者过时范围内没有空白控制,宁愿使用它来代替转换器,但从来没有找到一种方法来处理我们需要的选项 – BRisley 2012-01-06 21:47:31

+0

@BRisley你可以使用'DataTrigger'如果值等于0或'DateTime.MinValue'显示一个空值 – Rachel 2012-01-06 21:50:24