我有一个ListView,其内容我点击按钮刷新。 ListView绑定到视图模型中的ObservableCollection<MyClass>
。
但是,我在iOS上获取数据刷新时的空引用异常(但在Android中工作正常)。
在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 sender,Xamarin.Forms.Platform.iOS.VisualElementChangedEventArgs e)[0x0004e] in:0 在Xamarin.Forms.Platform.iOS.VisualElementRenderer
1[TElement].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs
1 [TElement] e)[0x0002c] in:0 在Xamarin.Forms.Platform.iOS.ViewRenderer2[TView,TNativeView].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs
1 [TElement] e)[0x00000] in:0 在Xamarin.Forms.Platform.iOS.ImageRenderer。&lt;&gt; 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/src/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices中的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000c]中/exceptionservicescommon.cs:152 在/Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.2/src/mono/mcs/class中的System.Runtime.CompilerServices.AsyncMethodBuilderCore +&lt;&gt; c.b__6_0(System.Object state)[0x00000] /referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1018 在UIKit.UIKitSynchronizationContext + c__AnonStorey0。&lt;&gt; 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 [],intptr,intptr) 在UIKit.UIApplication.Main(System.String [] args,System.IntPtr principal,System.IntPtr委托)[0x00005]在/ Users / builder / data / lanes / 5665 / 6857dfcc / source / xamarin-macios / src / UIKit中/UIApplication.cs:79 在/ Users / builder / data / lanes / 5665 / 6857dfcc / source / xamarin-macios / src / UIKit中的UIKit.UIApplication.Main(System.String [] args,System.String principalClassName,System.String delegateClassName)[0x00038] /UIApplication.cs:63 在/Users.user/Projects/proj/Company.Proj.Mobile/Company.Proj.Mobile.iOS/Main.cs中的Omers.MyTeam.Mobile.iOS.Application.Main(System.String [] args)[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是在应用程序启动时没有错误。 我点击一个按钮第二次重新填充ListView - 工作正常。我再次单击一个按钮来刷新ListView - 它出错了。
单击按钮只会刷新ListView绑定的ObservableCollection<MyClass>
中的数据。
非常感谢任何关于此的想法。谢谢!
答案 0 :(得分: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;
这种方法有效。不知道为什么另一种方式不起作用。
答案 1 :(得分:0)
遇到了同样的问题,但最新版本的Xamarin.Forms(2.5.1.444934)已经解决了这个问题。