Привязка с путем не работает, когда первый элемент на пути является нулевым

С 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 интерпретируется и используется по-разному. Это другое поведение:

Если у вас есть дополнительные тестовые примеры для добавления в этот список, загрузите их как репозитории GitHub и свяжите их с этим примером. (Но не ожидайте "очень быстрых" изменений / исправлений в этом связывающем коде - поскольку его изменение может сломать множество приложений, которые теперь полагаются на него, и как MvxValueConverters часто строятся так, чтобы быть более специфичными для типов, чем традиционные Microsoft IValueConverter из них)


А пока для этого конкретного случая:

  • FallbackValue может работать для вас как обходной путь (но может быть альтернативное значение перечисления может быть трудно сделать в XML)
  • или вы можете использовать пользовательскую привязку
  • или вы можете манипулировать структурой ViewModel.

Что касается точек останова, не работающих в PCL с Xamarin.Android, это регистрируется во многих местах и ​​является основной болью в течение более 6 месяцев. Согласно https://bugzilla.xamarin.com/show_bug.cgi?id=8209 это, по-видимому, теперь исправлено на альфа-канале, но, вероятно, никогда не появится в 4.6.

Другие вопросы по тегам