2008-09-24 40 views
12

我想将一个常量值添加到传入的绑定整数。事实上,我有几个地方我想要绑定到相同的源值,但添加不同的常量。因此,理想的解决办法是这样的......简单的算术运算WPF DataBinding?

<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=5}"/> 
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=8}"/> 
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=24}"/> 

(注:这是为了显示这个想法的例子,我实际的结合情况是不是一个TextBox的帆布财产但这给出了这个概念。更清楚地)

目前我唯一能想到的解决方案是公开许多不同的源属性,每个属性都增加了一个不同的常量到相同的内部值。所以我可以做这样的事情...

<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus5}"/> 
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus8}"/> 
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus24}"/> 

但这是非常严峻的,因为在未来我可能需要不断添加新属性的新常量。另外,如果我需要更改附加值,则需要更改源对象,这非常不错。

必须有比这更通用的方式吗?任何WPF专家有任何想法?

回答

6

我相信你可以用价值转换器来做到这一点。这是一个blog entry,它将一个参数传递给xaml中的值转换器。 this blog给出了实现一个值转换器的一些细节。

+0

值转换器可以采取参数似乎事实上用它就像在这里解决问题的一个好方法。感谢您的意见。 – 2008-09-24 05:51:51

0

我从来没有使用WPF,但我有一个可能的解决方案。

你的绑定路径能映射到一个Map吗?如果是这样,它应该能够接受一个参数(关键)。您需要创建一个实现Map接口的类,但实际上只是返回初始化添加到键的“Map”的基本值。

public Integer get(Integer key) { return baseInt + key; } // or some such 

没有一定的能力从标记中传递数字,我没有看到如何让它从原始值返回不同的增量。

4

使用值转换器是一个很好的解决方案,因为它允许您修改源值,因为它绑定到UI。

我在几个地方使用了以下内容。

public class AddValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     object result = value; 
     int parameterValue; 

     if (value != null && targetType == typeof(Int32) && 
      int.TryParse((string)parameter, 
      NumberStyles.Integer, culture, out parameterValue)) 
     { 
      result = (int)value + (int)parameterValue; 
     } 

     return result; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

<Setter Property="Grid.ColumnSpan" 
     Value="{Binding 
        Path=ColumnDefinitions.Count, 
        RelativeSource={RelativeSource AncestorType=Grid}, 
        Converter={StaticResource addValueConverter}, 
        ConverterParameter=1}" 
    /> 
18

我使用的是MathConverter,我创建做所有简单arithmatic操作有。该转换器的代码here,它可以这样使用:

<TextBox Canvas.Top="{Binding SomeValue, 
      Converter={StaticResource MathConverter}, 
      [email protected]+5}" /> 

,你甚至可以用更先进的arithmatic操作,如

Width="{Binding ElementName=RootWindow, Path=ActualWidth, 
       Converter={StaticResource MathConverter}, 
       ConverterParameter=((@VALUE-200)*.3)}" 
+0

不错的转换器,但是如果值是一个负数,就会中断。一个快速的解决方法是使用一些其他的符号,而不是“ - ”,并分别修改MathConverter代码中的操作数列表。当然,真正的解决方案需要在解析时添加更多的逻辑。 – 2014-06-25 13:33:10