2017-12-10 10 views
0

私はListViewを持っています。その内容はボタンクリックで更新されます。ビューモデルでListViewはObservableCollection<MyClass>にバインドされています。 しかし、データの更新時にiOSでnull参照例外が発生します(Androidでは正常に動作します)。TapGestureRecognizerのデータリフレッシュ時のヌル参照例外がコマンドにバインドされました

iOSアプリケーションでMainメソッドで例外がスローされます。

// NullReferenceException thrown here. 
UIApplication.Main(args, null, "AppDelegate"); 

以下はスタックトレースです。 Xamarin.Forms.Platform.iOS.EventTracker.LoadRecognizersで

()[0x0005d]:0 Xamarin.Forms.Platform.iOS.EventTracker.OnElementChangedで (System.Objectの送信者、Xamarin.Forms.Platform .iOS.VisualElementChangedEventArgs E)[0x0004e]:0 Xamarin.Forms.Platform.iOS.ViewRendererで2[TView,TNativeView].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs 1 [0 Xamarin.Forms.Platform.iOS.VisualElementRenderer 1[TElement].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs 1 [TElement] E)[0x0002c]中のTElement] e)[0x00000] in:0 (Xamarin.Forms.Platform.iOS.ImageRenderer)。 <> n__0(Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1 [TElement] e)[0x00000] in:0 Xamarin.Forms.Platform.iOS.ImageRenderer + d__2.MoveNext()[0x000d6] in:0 ---例外がスローされた前の場所からのスタックトレースの最後--- /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.2のSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000c]の /src/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:at System.Runtime.CompilerServices.AsyncMethodBuilderCore + <> c.b__6_0(System.Object状態)[0x00000] in/Library /Frameworks/Xamarin.iOS.framework/Versions/11.6.1.2/src/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1018 at UIKit.UIKitSynchronizat ionContext + c__AnonStorey0。 <> m_0()[0x00000] /Users/builder/data/lanes/5665/6857dfcc/source/xamarin-macios/src/UIKit/UIKitSynchronizationContext.cs:24 Foundation.NSAsyncActionDispatcher.Apply()[0x00000] in /Users/builder/data/lanes/5665/6857dfcc/source/xamarin-macios/src/Foundation/NSAction.cs:163 at(ラッパーによって管理されるネイティブ)UIKit.UIApplication:UIApplicationMain(int、string []、 /ユーザー/ビルダー/データ/レーン/ 5665/6857dfcc/source/xamarin-System.IntPtrプリンシパルSystem.IntPtrプリンシパルSystem.IntPtrプリンシパルSystem.IntPtrプリンシパルSystem.IntPtrプリンシパルSystem.IntPtrプリンシパルのSystem.IntPtrのUIKit.UIApplication.Mainで ) MacOSX/src/UIKit/UIApplication.cs:79 、UIKit.UIApplication.Main(System.String [] args、System.String principalClassName、System.String delegateClassName)/ Users/builder/data/lanes/5665の[0x00038] /6857dfcc/source/xamarin-macios/src/UIKit/UIApplication.cs:63 at Omers.MyTeam.Mobile.iOS.Application.Main(System.String [] args)/Users/user/Projects/proj/Company.Proj.Mobile/Company.Proj.Mobile.iOS/Main.csの[0x00001]: 12

以下は問題のコードです。

<ListView ItemsSource="{Binding PeopleData}" HasUnevenRows="True"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
       <Grid> 
        ... 
        <Image VerticalOptions="Center" 
           Source="phone_icon" 
           WidthRequest="45" 
           HeightRequest="45" 
           Margin="0,0,5,0" 
           Opacity="0.27"> 
          <!--<Image.GestureRecognizers> 
           <TapGestureRecognizer NumberOfTapsRequired="1" 
                 Command="{Binding Source={x:Reference PeoplePage}, Path=BindingContext.CallPersonCommand}" 
                 CommandParameter="{Binding .}"></TapGestureRecognizer> 
          </Image.GestureRecognizers>--> 
         </Image> 

       <Grid> 
      </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

画像のTapGestureRecognizerは、コメントを外すと例外が発生します。コンテンツページの名前はPeoplePageです。

ListViewが最初に読み込まれるときは、アプリケーションの起動時にエラーが発生しません。 2回目にListViewを再読み込みするためにボタンをクリックします。正常に動作します。 ListViewをリフレッシュするためにもう一度ボタンをクリックします。エラーが発生します。

ボタンをクリックすると、ListViewがバインドされているObservableCollection<MyClass>のデータが更新されます。

これに関するアイデアは大変ありがたいです。ありがとう!

+0

デバッガでステップ実行してみましたか? – Jason

+0

はい。コードは正常に動作します。そして、エラーがスローされます。 TapGestureRecognizerからCommandを削除しようとしましたが、空のイベントハンドラを代わりに使用しましたが、同じことが起こります。私がイベントハンドラを削除すると、うまく動作します。うーん... – erdinger

答えて

2

私はこの問題を以下のように解決しました。

前に、私がObservableCollection<MyClass>のデータをリフレッシュしていたとき、私は以下のようにします。

// PeopleData is ObservableCollection<MyClass> 
PeopleData.Clear(); 
foreach (var person in retrievedFromApiPeople) 
{ 
    PeopleData.Add(person); 
} 

今、私はPeopleDataプロパティのバッキングフィールドを追加し、単にプロパティに新しいObservableCollectionを割り当て、次のような通知を、上げます。

private ObservableCollection<MyClass> _peopleData; 
public ObservableCollection<MyClass> PeopleData 
{ 
    get => _peopleData; 
    set 
    { 
     _peopleData = value; 
     // INotifyPropertyChanged implementation. 
     RaisePropertyChanged(() => PeopleData); 
    } 
} 

そして、次のように使用してください。

PeopleData = retrievedFromApiPeople; 

このアプローチが有効です。なぜ他の方法が動作していないのか分かりません。

関連する問題