【问题标题】:Best practice when not implementing IValueConvert.ConvertBack不实施 IValueConvert.ConvertBack 时的最佳实践
【发布时间】:2010-09-20 21:35:34
【问题描述】:

只是想知道人们在实现没有有意义的 ConvertBack 实现(或仅用作 OneWay 的)的 IValueConverter 时认为最佳实践是什么?

它应该抛出(以及在那种情况下是什么异常),返回 null 还是返回一些默认值。

想法?

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

    IValueConverter.ConvertBack 的文档建议返回 DependencyProperty.UnsetValue

    数据绑定引擎不捕获 抛出的异常 用户提供的转换器。任何例外 ConvertBack 抛出的 方法,或任何未捕获的异常 由方法抛出的 ConvertBack 方法调用,被处理 作为运行时错误。处理预期 返回问题 DependencyProperty.UnsetValue.

    【讨论】:

      【解决方案2】:

      根据微软的说法,你应该返回DependencyProperty.UnsetValue

      【讨论】:

        【解决方案3】:

        我同意@Todd White 的回答。

        另外,为了节省时间,您可以实现一个基础转换器类,它为您实现了ConvertBack,这样您就不必每次都实现它来节省重复代码。

        从技术上讲,您也不必覆盖Convert;但它必须在ConverterBase 中实现,因为它实现了IValueConverter 接口的所有方法。在实践中,您每次都会覆盖Convert,而ConvertBack 在大多数情况下都可以忽略。

        public class ConverterBase : IValueConverter
        {
            public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return DependencyProperty.UnsetValue;
            }
            public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return DependencyProperty.UnsetValue;
            }
        }
        
        public class VisibilityConverter : ConverterBase
        {
            public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return ((bool)value ^ (parameter as bool? == true)).ToVisibility();
            }
        }
        

        【讨论】:

          【解决方案4】:

          当 ConvertBack 不包含任何功能并且您不希望调用它时,抛出 NotImplementedException。它不应该被调用,因此你需要一个运行时异常。

          如果 ConvertBack 是有意被调用的,那么你最好为它提供一个实现。一种选择是仅返回 DependencyProperty.UnsetValue,或通过返回 DependencyProperty.UnsetValue 在您的 ConvertBack 实现中处理异常。

          我的理由是:返回一个 DependencyProperty.UnsetValue 而不是抛出一个 NotImplementedException 使得它在调用 ConvertBack 方法时不明显,而你真的不希望它这样做。也许它现在应该具有一些功能,因为它正在被调用并引发运行时异常。如果只是返回 DependencyProperty.UnsetValue,那么发现缺少的 ConvertBack 功能会困难得多。

          【讨论】:

          • 如果您要这样做,您应该使用NotSupportedExceptionNotImplementedException 用于当前未实现但将要实现的功能。
          猜你喜欢
          • 2015-06-14
          • 2012-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-17
          • 2018-10-11
          • 2011-08-22
          相关资源
          最近更新 更多