【问题标题】:What is best practise for IValueConverter?IValueConverter 的最佳实践是什么?
【发布时间】:2011-02-09 11:58:58
【问题描述】:
  • IValueConverter 的最佳做法是什么?
  • 是否可以将异常放入 Convert 方法中,还是应该返回“某物”?

这是一个例子:

[ValueConversion(typeof(float), typeof(String))]
public class PercentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || string.IsNullOrEmpty(value.ToString()))
            return string.Empty;

        if (value is float) //Edited to support CultureInfo.CurrentCulture,
            return string.Format(culture, "{0:n}{1}", ((float)value) * 100, "%");

        //** Is it ok to put Exception here or should I return "something" here? **
        throw new Exception("Can't convert from " + value.GetType().Name + ". Expected type if float.");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException("Converting back is not implemented in " + this.GetType());
    }
}

【问题讨论】:

  • IValueConverter 的最佳实践是什么?
  • @Amit:最好将关于异常的评论拉到前面的文本中。
  • 我在代码中添加了注释! “可以把异常放在这里还是我应该在这里返回“东西”?”
  • 相关问题:一段字符串有多长?

标签: c# .net wpf xaml


【解决方案1】:

如果转换失败(格式错误的值、类型等),请返回 DependencyProperty.UnsetValue

它表示转换器没有产生任何值,并且绑定使用 FallbackValue(如果可用)或默认值。

此外,为了安全起见,您应该使用特定于文化的转换或不变的转换来转换数据。

【讨论】:

  • 我应该返回 string.Empty 吗?
  • return DependencyProperty.UnsetValue; 您可以使用其他返回值来修改绑定引擎的行为。您可以按照我在答案中提供的链接进一步阅读。这是使用DependencyProperty.UnsetValue的示例:msdn.microsoft.com/en-us/library/…
  • 根据this link,如果绑定不应设置特定值,您可以使用Binding.DoNothing。不过,这应该更多地用于多值转换器之类的东西。
【解决方案2】:

我个人建议使用单例转换器。然后您不必在每个使用站点都创建实例,但可以像这样引用转换器:

Converter={x:Static SomeNamespace:SomeConverter.Instance}

【讨论】:

    【解决方案3】:

    您在解析字符串时忽略了CultureInfo

    始终考虑传递的文化信息,否则它将始终适用于 Thread 的 CurrentCulture。

    我可以输入“7.34,123”之类的内容,你的代码可以工作吗?

    【讨论】:

      猜你喜欢
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多