MvvmCross を使用して、ViewModel のデータを axml レイアウト ファイルのプロパティにバインドしています。これらのバインドは、アプリケーションが完全に読み込まれると正しく機能します。ただし、デバッグ出力ログに多数の「MvxBind:Error」メッセージがあり、「Null オブジェクトを値型に変換できません」というメッセージが表示されます。これらのエラーはすべて、Android アプリが最初の "SplashScreen.axml" ビューを表示する前に発生します。その後、すべてのバインディングが期待どおりに機能します。
これらのエラーは、カスタム コントロールのプロパティに値をバインドする場合、またはカスタム コンバーターを介して渡される値をバインドする場合にのみ発生することにも注意してください。たとえば、文字列を TextView の Text プロパティにバインドするなどの問題は見られませんでした。
エラーのログ出力の例:
MvxBind:Error: 17.76 Problem seen during binding execution for from LocationCurrentMovementViewModel.IsAlarmSignaled to Visibility - problem InvalidCastException: Null object can not be converted to a value type.
07-17 20:05:51.980 I/mono-stdout( 3056): MvxBind:Error: 17.76 Problem seen during binding execution for from LocationCurrentMovementViewModel.IsAlarmSignaled to Visibility - problem InvalidCastException: Null object can not be converted to a value type.
07-17 20:05:51.980 I/mono-stdout( 3056): at System.Convert.ToType (System.Object value, System.Type conversionType, IFormatProvider provider, Boolean try_target_to_type) [0x00000] in <filename unknown>:0
07-17 20:05:51.990 I/mono-stdout( 3056): at System.Convert.ChangeType (System.Object value, System.Type conversionType, IFormatProvider provider) [0x00000] in <filename unknown>:0
07-17 20:05:51.990 I/mono-stdout( 3056): at Cirrious.MvvmCross.Binding.ExtensionMethods.MvxTypeExtensions.MakeSafeValue (System.Type propertyType, System.Object value) [0x00000] in <filename unknown>:0
07-17 20:05:51.990 I/mono-stdout( 3056): at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.MakeSafeValue (System.Object value) [0x00000] in <filename unknown>:0
at System.Convert.ToType (System.Object value, System.Type conversionType, IFormatProvider provider, Boolean try_target_to_type) [0x00000] in <filename unknown>:0
at System.Convert.ChangeType (System.Object value, System.Type conversionType, IFormatProvider provider) [0x00000] in <filename unknown>:0
at Cirrious.MvvmCross.Binding.ExtensionMethods.MvxTypeExtensions.MakeSafeValue (System.Type propertyType, System.Object value) [0x00000] in <filename unknown>:0
at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.MakeSafeValue (System.Object value) [0x00000] in <filename unknown>:0
at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue (System.Object value) [0x00000] in <filename unknown>:0
07-17 20:05:51.990 I/mono-stdout( 3056): at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue (System.Object value) [0x00000] in <filename unknown>:0
at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (Boolean isAvailable, System.Object value) [0x00000] in <filename unknown>:0
[0:] MvxBind:Error: 17.76 Problem seen during binding execution for from LocationCurrentMovementViewModel.IsAlarmSignaled to Visibility - problem InvalidCastException: Null object can not be converted to a value type.
at System.Convert.ToType (System.Object value, System.Type conversionType, IFormatProvider provider, Boolean try_target_to_type) [0x00000] in <filename unknown>:0
at System.Convert.ChangeType (System.Object value, System.Type conversionType, IFormatProvider provider) [0x00000] in <filename unknown>:0
at Cirrious.MvvmCross.Binding.ExtensionMethods.MvxTypeExtensions.MakeSafeValue (System.Type propertyType, System.Object value) [0x00000] in <filename unknown>:0
at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.MakeSafeValue (System.Object value) [0x00000] in <filename unknown>:0
at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue (System.Object value) [0x00000] in <filename unknown>:0
at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (Boolean isAvailable, System.Object value) [0x00000] in <filename unknown>:0
07-17 20:05:51.990 I/mono-stdout( 3056): at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (Boolean isAvailable, System.Object value) [0x00000] in <filename unknown>:0
その特定のエラーをスローしているバインディングは次のとおりです。
<FrameLayout
p1:minWidth="25px"
p1:minHeight="25px"
p1:layout_width="317dp"
p1:layout_height="360dp"
p1:id="@+id/MovementAlertOverlay"
p1:layout_marginTop="135dp"
p1:layout_marginLeft="639dp"
p1:background="@drawable/alert_border"
local:MvxBind="Visibility LocationCurrentMovementViewModel.IsAlarmSignaled,Converter=BoolToViewStates"
/>
コンバーターのコード:
public class BoolToViewStatesValueConverter : MvxValueConverter<bool, ViewStates>
{
protected override ViewStates Convert(bool value, System.Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if (value)
{
return ViewStates.Visible;
}
return ViewStates.Gone;
}
}
何かを返す前に、コンバーターで「値」をチェックして、null かどうかを確認してみました。また、「LocationCurrentMovementViewModel.IsAlarmSignaled」をデフォルト値に初期化しようとしました。これは、表示されるエラーには影響しません。
オブジェクト「LocationCurrentMovementViewModel」は、axml レイアウト ファイルに関連付けられた ViewModel 内にネストされています。実行時に動的に設定されます。ただし、これが問題の原因ではないことを確認しました。一時オブジェクト「TempBoolTrue」を作成しました。これは、真に設定された単なるブール変数です。これを使用して、axml レイアウト ファイルの「LocationCurrentMovementViewModel.IsAlarmSignaled」を置き換えました。これは、「TempBoolTrue」の代わりに同様のエラーが発生しました"LocationCurrentMovementViewModel.IsAlarmSignaled".
この問題を解決するためのご支援をいただければ幸いです。
ありがとう!
- - 編集 - -
最近、このプロジェクトに取り組み始めました。だから、最初にセットアップされたとき、私は周りにいませんでした。明らかになったいくつかの問題がありました。
- MvvmCross リソースは手動で追加されました。これらは、nuget を使用して、正しいバージョン 3.0.9 で追加されるようになりました。
- また、SplashScreen.cs が削除されていることも発見しました。SplashScreen.axml のカスタム バージョンは、起動プロセスの後半で呼び出されます。
- Android アプリが不規則に起動します。アプリをこのように起動するのには、もともと正当な理由があったようです。ただし、結果のソリューションを少し変更する必要がある場合があります。
この残りの部分を整理するには、しばらく時間がかかります。しかし、あなたの投稿は問題の原因を発見するのに役立ちました。ありがとうスチュアート!