【问题标题】:Correct way to not implement ConvertBack on a IMultiValueConverter在 IMultiValueConverter 上不实现 ConvertBack 的正确方法
【发布时间】:2018-04-27 02:15:47
【问题描述】:

我有一个实现IMultiValueConverter 的对象。它用于根据特定 bool 值和特定枚举值的特定排列绑定列的可见性,这两者都是绑定数据的一部分。 ConvertBack 方法本身显然没有任何意义。

在常规 IValueConverter 上,我可以返回 Binding.DoNothing,但这不是 object[],因此不会编译。

我目前抛出了一个异常,但感觉并不理想。有没有更好的办法?

【问题讨论】:

  • 试试这个:public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfoculture) { return new object[] {value}; }
  • 你也可以试试这个: public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfoculture) { return new[] { value, Binding.DoNothing}; } ..........OR................. public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfoculture) { return新[] {Binding.DoNothing}; }
  • 为什么要使用IMultiValueConverter 来控制列的可见性?它被认为是用于转换的。当然,调用它的时间可能是控制可见性的理想选择,但这并不能使它成为您正在做的事情的正确选择。尽管很多人这样误用它,然后面对你所面临的问题。
  • 请参阅this
  • @GaurangDave 的建议不起作用,因为如果您返回一个对象数组,它的长度必须与 MultiBinding 中的绑定数量相匹配。

标签: c# wpf imultivalueconverter


【解决方案1】:

实现不支持反向转换的 IValueConverter 或 IMultiValueConverter 的 ConvertBack 方法的正确方法是抛出 NotSupportedException

返回Binding.DoNothing 没有意义,因为无论如何都不应该调用该方法。但是,如果它被意外调用,你会得到一个告诉你出了什么问题的异常。

public object[] ConvertBack(
    object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
    throw new NotSupportedException();
}

【讨论】:

  • 我可以看到 NotSupportedException 在这种情况下是如何合理的。我认为 Gaurang Dave 的建议可能适用于这个转换器,我确切地知道参数的数量。 CodingYoshi 有一个合理的观点,很多时候这应该通过样式触发器来完成。我不确定它是否能够与 enum HasFlag 一起工作,这意味着我将失去已经在行为上的测试用例覆盖率。因此,接受这一点。
  • 这个答案应该澄清,所描述的 "正确" 方法仅适用于ConvertBack() 方法实际上不被使用的情况。对于IValueConverterIMultiValueConverterConvertBack() 方法都有有效的使用场景,这个答案让那些按字面意思理解措辞的新手感到困惑(例如stackoverflow.com/questions/58844254/…)。
  • @PeterDuniho 这个细节在问题标题中很清楚。
  • 对于不支持ConvertBackIMultiValueConverterdocumentation实际上声明"返回null表示转换器无法执行转换或不支持这个方向的转换。”
【解决方案2】:

返回null

对于IMultiValueConverterConvertBack 文档特别指出:

返回null 表示转换器无法执行 或它不支持这个方向的转换

【讨论】:

  • @Clemens 在我看来,优雅地失败而不是因为绑定问题而使整个程序崩溃更好。如果您正在编写自己使用的转换器,您可以轻松查看代码以查看是否支持 ConvertBack,如果您将其作为库的一部分提供,您的文档应明确说明是否可以使用或不。如果有人故意使用ConvertBack,他们会期望它返回一个值,并且应该很快看到它没有给他们预期的东西,如果他们在不知不觉中这样做,如果它没有给他们一个价值,会不会有伤害?
  • “由于绑定问题导致整个程序崩溃” - 你把事情搞糊涂了。清楚地表明发生了意外事件的异常不是崩溃。这是您看到的——至少如果您是开发人员的话。
  • @Clemens 终止执行的异常是崩溃。
  • @Clemens 这仍然是一个崩溃,开发者与否。您所说的只是您认为不可恢复的崩溃是有助于发展的理想情况,我不同意。
猜你喜欢
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 2010-09-21
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多