Fluent绑定不按预期工作

时间:2014-05-22 18:47:46

标签: mvvmcross

假设我使用

绑定
bs.Bind(y)
  .For(v => v.Visibility)
  .To("Failures['TaxPercent'].Length")
  .WithConversion("Visibility")
  .WithFallback(false);

其中Failures是包含属性名称(例如TaxPercent)的字典,当且仅当属性未通过验证时。 因此Failure['TaxPercent']返回验证失败消息(例如缺少值)。

我希望Android中有一个可扩展的textview,只有在检测到错误时才可见。我使用上面的代码,它不起作用。当字典中不存在Failure['TaxPercent']时,不会触发回退值。

如何使用viewmodel中的字典根据验证结果获取可扩展/可折叠的textview?我真的想使用字典,因为这样可以避免为每个属性创建IsErrorVisible。

奇怪的是,使用字典可用于检索错误消息,但不是为了可见性!换句话说,这很有效。

bs.Bind(y)
.For(v => v.Text)
.To("Failures['TaxPercent']");

另外,我无法连接绑定的任何原因,这意味着我可以这样做吗???

bs.Bind(y)
  .For(v => v.Text)
  .To("Failures['TaxPercent']")
  .For(v => v.Visibility)
  .To("Failures['TaxPercent'].Length")
  .WithConversion("Visibility")
  .WithFallback(false);

修改

日志中的错误消息是 MvxBind:错误:168.86绑定执行时出现问题绑定可见性失败['TaxPercent']。长度 - 问题ArgumentException:传入的值必须是枚举基础或枚举的基础类型,例如Int32。

1 个答案:

答案 0 :(得分:1)

如果字典不包含“TaxPercent”条目,则表达式Failures['TaxPercent'].Length将不会评估(将抛出异常),因此将使用UnsetValue

UnsetValue的情况下,不会调用ValueConverter,并且将使用Fallback。这与Wpf中的模式相同 - http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.unsetvalue(v=vs.110).aspx

对于您的特定情况,看起来您可以:

  • 将Fallback更改为平台的正确值而不是布尔值(问题未指定您正在使用的平台)
  • 创建一个新的Visibility ValueConverter,将Failures作为其绑定源,并将'TaxPercent'作为其参数
  • 从绑定表达式中删除.Length - 只测试条目是否存在。
  • 你可以切换到自由文本绑定表达式 - 然后你可以做更复杂的绑定语句,包括嵌套绑定,多值转换器,多个回退值,......

对于这种特殊情况,我只想放弃.Length

对于“我无法连接的任何原因”,这将不起作为Bind的返回类型是单个Fluent绑定条目 - 而不是Fluent绑定集。