1

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".

この問題を解決するためのご支援をいただければ幸いです。

ありがとう!

- - 編集 - -

最近、このプロジェクトに取り組み始めました。だから、最初にセットアップされたとき、私は周りにいませんでした。明らかになったいくつかの問題がありました。

  1. MvvmCross リソースは手動で追加されました。これらは、nuget を使用して、正しいバージョン 3.0.9 で追加されるようになりました。
  2. また、SplashScreen.cs が削除されていることも発見しました。SplashScreen.axml のカスタム バージョンは、起動プロセスの後半で呼び出されます。
  3. Android アプリが不規則に起動します。アプリをこのように起動するのには、もともと正当な理由があったようです。ただし、結果のソリューションを少し変更する必要がある場合があります。

この残りの部分を整理するには、しばらく時間がかかります。しかし、あなたの投稿は問題の原因を発見するのに役立ちました。ありがとうスチュアート!

4

1 に答える 1

0

これが起こるという考え

Android アプリが最初の「SplashScreen.axml」ビューを表示する前。

スプラッシュスクリーンは通常、バインドシステムを含むほとんどの MvvmCross がブートストラップされる前に表示されるため、少し憂慮すべきことです。


説明を読んでも、何が問題なのかわかりません。スプラッシュ画面が表示される前にバインディングエラーが発生する方法が本当にわかりません。

おそらく型変換に関連していますが、これで列挙値MakeSafeValueからの変換を正しく処理できると「信じています」 - MakeSafeValueTest.cs#L98のテスト ケースを参照してください。Null

これをデバッグするには、次のことをお勧めします。

  1. 最新の MvvmCross リリース (nuget で 3.0.9、Mvvmcross-Binaries で 7 月 13 日、または MvvmCross リポジトリでタグ付けされた 3.0.9) を使用していることを確認してください。

  2. 新しい単純なプロジェクト/ソリューションを作成してみて、そこで問題を再現できるかどうかを確認してください (テスト用の新しいコアとドロイド プロジェクトを作成するのに本当に 1 分しかかかりません)。

  3. デバッグ中に解決策が見つからない場合は、https://github.com/slodge/MvvmCross/issues/newで問題を提起し、デバッグを支援するためにテスト リポジトリを GitHub にプッシュできます。

于 2013-07-18T07:33:29.790 に答える