绑定到命令

时间:2017-12-10 03:12:02

标签: ios xamarin.forms

我有一个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.ViewRenderer 2[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>中的数据。

非常感谢任何关于此的想法。谢谢!

2 个答案:

答案 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)已经解决了这个问题。