Привязка с путем не работает, когда первый элемент на пути является нулевым
С MvvmCross я пытаюсь связать android: видимость TextView с путем, похожим на "Results.Count", с конвертером, установленным для преобразования целого числа в видимость (если не ноль и больше нуля, TextView виден).
Если Results имеет значение null, в выводе приложения отображается ошибка:
[MvxBind] 1.34 Ошибка при выполнении привязки для SearchResult.Count к Visibility - проблема InvalidCastException: нулевой объект не может быть преобразован в тип значения. [MvxBind] в System.Convert.ToType (значение System.Object, System.Type ConversionType, поставщик IFormatProvider, логическое значение try_target_to_type) [0x00000] в:0 [MvxBind] в System.Convert.ChangeType (значение System.Object, System.Tbject convertType, поставщик IFormatProvider) [0x00000] в:0 [MvxBind] в Cirrious.MvvmCross.Binding.ExtensionMethods.MvxTypeExtensions.MakeSafeValue (значение System.Type propertyType, значение System.Object) [0x00000] в миллиметрах в миллиметрах в 0.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.MakeSafeValue (значение System.Object) [0x00000] в:0 [MvxBind]
в Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue (значение System.Object) [0x00000] в:0 [MvxBind]
at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (Boolean isAvailable, значение System.Object) [0x00000] в:0 MvxBind: Ошибка: 1.34 Проблема, обнаруженная во время выполнения привязки для объекта SearchResult.Count для Visibility - проблема: InvalidExEx не может быть преобразовано в тип значения. MvxBind: Ошибка: 1,34. Проблема, возникающая при выполнении привязки для из SearchResult.Count к Visibility - проблема InvalidCastException: нулевой объект не может быть преобразован в тип значения. в System.Convert.ToType (значение System.Object, System.Type translationType, поставщик IFormatProvider, логическое значение try_target_to_type) [0x00000] в: 0 в System.Convert.ChangeType (значение System.Object, System.Type translationType, поставщик IFormatProvider) 0x00000] в: 0
Конвертер не вызывается. Я бы ожидал, что в этом случае будет вызван конвертер, как в Silverlight или WPF.
Я попытался отладить эту проблему самостоятельно, добавив MvvmCross по исходному коду (я добавил все необходимые проекты из github). Я установил точки останова в различных методах, показанных в стеке вызовов исключений (пример: Cirrious.MvvmCross.Binding.ExtensionMethods.MvxTypeExtensions.MakeSafeValue), но при запуске точки останова не были затронуты, они были проигнорированы отладчиком.
Странно то, что установка точки останова в других частях исходного кода MvvmCross (как в MvxAndroidSetup) работала.
Помимо проблемы с конвертером, я хотел бы знать, как заставить точки останова работать в коде MvvmCross. Это позволило бы мне понять больше и даже поучаствовать в разработке, если это возможно.
1 ответ
Есть небольшие различия между путями привязки / вычисления для MvvmCross против Xaml.
В частности, мы знаем FallbackValue
интерпретируется и используется по-разному. Это другое поведение:
- происходит в строке MvxFullBinding.cs # L109
- зарегистрирован в https://github.com/slodge/MvvmCross/issues/297.
Если у вас есть дополнительные тестовые примеры для добавления в этот список, загрузите их как репозитории GitHub и свяжите их с этим примером. (Но не ожидайте "очень быстрых" изменений / исправлений в этом связывающем коде - поскольку его изменение может сломать множество приложений, которые теперь полагаются на него, и как MvxValueConverters
часто строятся так, чтобы быть более специфичными для типов, чем традиционные Microsoft IValueConverter
из них)
А пока для этого конкретного случая:
FallbackValue
может работать для вас как обходной путь (но может быть альтернативное значение перечисления может быть трудно сделать в XML)- или вы можете использовать пользовательскую привязку
- или вы можете манипулировать структурой ViewModel.
Что касается точек останова, не работающих в PCL с Xamarin.Android, это регистрируется во многих местах и является основной болью в течение более 6 месяцев. Согласно https://bugzilla.xamarin.com/show_bug.cgi?id=8209 это, по-видимому, теперь исправлено на альфа-канале, но, вероятно, никогда не появится в 4.6.