【问题标题】:Double "1/3" as ConverterParameter双 "1/3" 作为 ConverterParameter
【发布时间】:2011-05-23 10:43:11
【问题描述】:

我必须使用转换器和参数将双精度转换为其他:

这是我的 XAML 存根:

Converter={StaticResource ToOtherDoubleConverter}, ConverterParameter=-1/2

这是转换器:

[ValueConversion(typeof(double), typeof(double))]
public class DoubleToOtherDoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          CultureInfo culture)
    {
        return (double)value * double.Parse(parameter.ToString());
    }

现在,说这取决于文化等等是没有用的。

有没有办法“硬编码”一个双精度数以被识别为双精度数? 因为上面的变体可以用不同的方式编写,例如:

ConverterParameter=-1/2
ConverterParameter=-0.5
ConverterParameter=-0,5
etc.

也可以

double.Parse(parameter.ToString());
(double)parameter;

等等……

还有一个问题:

如何以浮动格式指定1/3?像

ConverterParameter=0.333333333333333333333333333333333333333333333333333333

【问题讨论】:

  • 您确定它是作为数值传入的吗?根据我的经验,大多数 XAML 值最终都会作为字符串传入,即使它们看起来像数字......
  • @Dan Puzey: 就像object 一样……最后可能是字符串,这就是我问的原因,因为不知道 :)
  • 如果您在转换器的第一行设置断点,您可以检查 value.GetType() 并查看它传递的内容...
  • @Dan:有理由:parameter.GetType() {Name = "String" FullName = "System.String"} System.Type {System.RuntimeType}

标签: .net wpf xaml converter


【解决方案1】:

不幸的是,IValueConverter 接口提供了接受对象(不是类型保存)而不是泛型的方法。
但是您可以在解析中添加 Culture.InvariantCulture 并引发异常。这样您就可以通知用户“不正确”的格式。

【讨论】:

  • 你不能。 1/3 不是数字,它是一个算术表达式。出于您的目的,我将创建两个转换器-> MultiplierConverter 和 DividerConverter。您也可以只反转逻辑并创建一个 Divider 转换器,但这会使您的 xaml barley 可读...
【解决方案2】:

试试这个

public class DoubleToOtherDoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        var frac = ((string) parameter).Split('/');
        if (frac.Length == 2)
            return (double) value*double.Parse
                (frac[0])/double.Parse(frac[1]);
        return (double) value* double.Parse(((string) parameter)
            .Replace(",", "."));
    }

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

【讨论】:

  • :) 最后,这是我不喜欢的“硬”变体。但由于它唯一对我有用,我别无选择。只是我在最后添加了 CultureInfo.InvariantCulture。
猜你喜欢
  • 2013-05-29
  • 1970-01-01
  • 2012-04-23
  • 2012-03-12
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
相关资源
最近更新 更多