【问题标题】:binding with path doesn't work when first item on path is null当路径上的第一项为空时,与路径的绑定不起作用
【发布时间】:2013-06-08 23:02:57
【问题描述】:

使用 MvvmCross,我正在尝试将 TextView 的 android:visibility 绑定到类似于“Results.Count”的路径,并使用转换器设置将整数转换为可见性(如果不为 null 且大于零,则 TextView 可见) .

如果 Results 为 null,则在应用输出中显示错误:

[MvxBind] 1.34 绑定执行期间出现的问题 from SearchResult.Count to Visibility - 问题 InvalidCastException: Null 对象不能转换为值类型。 [MvxBind] 在 System.Convert.ToType(System.Object 值,System.Type 转换类型、IFormatProvider 提供程序、布尔值 try_target_to_type) [0x00000] 在 :0 [MvxBind] 在 System.Convert.ChangeType(System.Object 值,System.Type ConversionType,IFormatProvider 提供程序)[0x00000] in :0 [MvxBind] at Cirrious.MvvmCross.Binding.ExtensionMethods.MvxTypeExtensions.MakeSafeValue (System.Type propertyType, System.Object 值) [0x00000] in :0 [MvxBind] at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.MakeSafeValue (System.Object 值) [0x00000] in :0 [MvxBind]
在 Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue (System.Object 值) [0x00000] in :0 [MvxBind]
在 Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (布尔 isAvailable,System.Object 值)[0x00000] in :0 MvxBind:Error: 1.34 绑定执行期间出现的问题 从 SearchResult.Count 到 Visibility - 问题 InvalidCastException:Null 对象无法转换为值 type.MvxBind:Error: 1.34 绑定执行期间出现的问题 从 SearchResult.Count 到 Visibility - 问题 InvalidCastException: Null 对象不能转换为值类型。在 System.Convert.ToType(System.Object 值,System.Type 转换类型、IFormatProvider 提供程序、布尔值 try_target_to_type) [0x00000] in :0 在 System.Convert.ChangeType (System.Object 值、System.Type 转换类型、IFormatProvider 提供者)[0x00000] in :0

转换器没有被调用。 我本来希望在这种情况下调用转换器,就像在 Silverlight 或 WPF 中一样。

我尝试通过源代码添加 MvvmCross 自己调试此问题(我从 github 添加了所有必要的项目)。 我在异常调用堆栈中显示的不同方法中设置了断点(例如:Cirrious.MvvmCross.Binding.ExtensionMethods.MvxTypeExtensions.MakeSafeValue),但是在运行时,没有命中断点,它们被调试器忽略了。

奇怪的是,在 MvvmCross 源代码的其他部分(如在 MvxAndroidSetup 中)设置断点有效。

除了转换器的问题,我想知道如何使断点在 MvvmCross 代码中工作。如果可能的话,它会让我了解更多,甚至参与到开发中。

【问题讨论】:

    标签: android xamarin.ios xamarin.android mvvmcross


    【解决方案1】:

    MvvmCross 与 Xaml 的绑定路径/计算之间存在细微差别。

    特别是,我们知道FallbackValue 的解释和使用方式不同。这种不同的行为:

    如果您有其他测试用例要添加到该列表中,请将它们作为 GitHub 存储库上传并将它们链接到该用例。 (但不要指望对绑定代码进行“非常快速”的更改/修复 - 因为更改它可能会破坏现在依赖它的许多应用程序,并且 MvxValueConverters 通常构建为比传统的 Microsoft @ 更具体的类型987654327@个)


    同时,对于这种特殊情况:

    • FallbackValue 可能适合您作为一种解决方法(但可能是枚举后备值,在 xml 中可能很难做到)
    • 或者您可以使用自定义绑定
    • 或者您可以操作 ViewModel 结构。

    至于断点在 Xamarin.Android 的 PCL 中不起作用,这已记录在很多地方,并且在 6 个月内一直是一个主要问题。根据https://bugzilla.xamarin.com/show_bug.cgi?id=8209,这显然现在已固定在 Alpha 通道上,但可能永远不会出现在 4.6 中。

    【讨论】:

    • 我今天也遇到了同样的问题。有点晚了,所以我关掉了电脑上床睡觉。现在 ai 在这里找到了这个答案。谢谢 Opcoder 的问题和答案。明天我想我会使用自定义绑定选项。我喜欢创建自定义绑定 :)
    • 非常感谢斯图尔特。我以前读过关于 PCL 调试问题的文章,但我认为是关于 VisualStudio 的。我正在使用 Xamarin Studio,并且没有命中断点。我还有其他问题,例如有时会在编译时出错,除非我先执行“全部重建”,否则它将无法正常工作,之后错误会神奇地消失。斯图尔特,我想知道你是如何在调试器没有遇到断点的情况下开发和调试 MVVMCross 问题的。我将尝试查看 Debug.Break 是否可用并将触发调试器。
    • 嗨 Stuart,绑定路径的解释与 XAML 不同有什么具体原因吗?我试过你的建议 FallbackValue=ViewStates.Visible 但它不起作用。仅出于这个原因进行自定义绑定似乎有点过多,特别是因为我将 4 个控件绑定到该结果模型的不同属性。听起来我必须实现 4 个自定义绑定。我想知道我是否可以实现自己的绑定来覆盖 MVVMCross 行为,这可能吗?不幸的是,如果没有调试,我很难理解它是如何工作的以及要改变什么......
    • 对于您提出的问题的长度而言,评论并没有那么有用...我也不知道如何在这里找到答案!
    • 在花了一些时间试图理解代码之后,我想我找到了一个简单的解决方法。 github.com/slodge/MvvmCross/blob/v3/Cirrious/… 应该是 'if (isAvailable || _bindingDescription.FallbackValue == null)'。它不应该破坏任何依赖于为 FallbackValue 设置的值的当前应用程序。
    猜你喜欢
    • 1970-01-01
    • 2017-07-13
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多