Xamarin.forms: [Bug] Picker sets null to bound property on BindingContext change

Created on 1 Sep 2019  Â·  21Comments  Â·  Source: xamarin/Xamarin.Forms

Description

Picker's doesn't handle changing BindingContext properly - If a Picker's SelectedItem is bound to a property (for example ChosenColor) then the bound property (ChosenColor) will be set to null if you change BindingContext of a ContentPage

Steps to Reproduce

I prepared a solution which demonstrates the issue:
https://github.com/milanio/xamarin.pickerbugs1

In addition, see attached gifs below

  1. Build & Run
  2. Click Example 1 - it shows that if ItemSource and SelectedItem is bound to a property on VM then whenever you change BindingContext, property bound to SelectedItem will be set to null
  3. Click Example 2 - It shows that if a Picker is in a CollectionView then property bound to SelectedItem is set to null (whether ItemsSource is bound or not)
  4. Click Example 3 - It shows that the order of XAML attributes actually decides when bound property is set to null

Expected Behavior

A VM Property bound to SelectedItem will not change just because ContentPage BindingContext changed

Actual Behavior

VM Property bound to SelectedItem is set to null

Basic Information

  • Version with issue: Xamarin Forms 4.2.0.709249
  • Last known good version: N/A
  • IDE: VS 2019 16.1
  • Platform Target Frameworks:

    • Android: 9.0

    • Android Support Library Version: N/A (Default from Xamarin.Forms)

  • Nuget Packages:
  • Affected Devices:
    Tested on:
    1.Emulator
  • HTC One Plus 3T

Screenshots

Example 1

Example1

Example 2

Example2

Example 3

Example3

Reproduction Link

https://github.com/milanio/xamarin.pickerbugs1

binding ⛓ in-progress Android unverified bug

Most helpful comment

@bizmonger you may find that that appears to work until you use the picker in a complex binding scenario like the CarouselView.

All 21 comments

Same Problem in iOS

I see there are already some issues that describe the same thing, i.e.: #1879, #2032 and #2751. Does one of these describe your issue? If so, I would like to suggest to append to that one and track the progress from there.

Thanks!

@jfversluis They all seem to more or less describe the same problem and this one and #1879 seem to describe it the best. But it seems that this problem persists since 2.5.0. I compiled my own version of xamarin forms on the base of 3.1.0 with the fixes from this PR https://github.com/xamarin/Xamarin.Forms/pull/3007 that got never merged into production. I now tried to update to 4.2.0 and this bug still persists.

I can see that this has traveled a long way unfortunately, sorry about that.

We are happy to see any fixes in this area. As you can see in the PR you referenced, it was pretty big and lacked any form of tests etc. I think that is the main reason why it didn't get merged back then. If you are willing and able to provide fixes, preferably in small PRs backed up with some tests, I'm happy to take a look at them and get rid of these bugs once and for all

@jfversluis I looked into the Issue and I think I fixed it (I don't know if the fix has any side effects). Have a look at my PR #7448

Also looking forward to this PR. In the meantime, the SelectedIndex property seems to be behaving as expected. As a workaround, I'm doing this:

SelectedStatusIndexLookup = StatusLookup.FindIndex(s => s.LookupId.Equals(SelectedStatusLookup.LookupId));

Is there a better workaround?

@jfversluis @StephaneDelcroix @DerGary - I'm happy to help with fixing and writing UI Test but can you confirm this is what the expected behavior is:

Case A. ItemsSource != null && SelectedItem!=null => ItemsSource == null

In this scenario we have valid SelectedIndex, SelectedItem, ItemsSource and then for whatever reason we loose ItemsSource ( for example BindingContext changed or Template changed).

Expected result:

SelectedIndex => -1
SelectedItem = no change, still points to the selected object

UI Behaviour: You can see SelectedItem (for example its DisplayName). However when you try to open the list of options it will be empty

Case B. ItemsSource == null (&& SelectedItem !=null)=> ItemsSource != null

This can happen after Case A

Expected result:
SelectedIndex = -1 or index of SelectedItem in the ItemsSource (if it exists in the list)
SelectedItem = no change

UI Behaviour: You can see SelectedItem (for example its DisplayName) and when you try to open the list of options it will contain items from the new ItemsSource

Case C. ItemsSource != null (&& SelectedItem !=null)=> ItemsSource == [DifferentList]

We have valid SelectedIndex, SelectedItem, ItemsSource and ItemsSource changes and it no longer contains SelectedItem

Expected result:
SelectedIndex = -1 or index of SelectedItem in the new ItemsSource (if it exists in the list)
SelectedItem = no change

UI Behaviour: You can see SelectedItem (for example its DisplayName) and when you try to open the list of options it will contain items from the new ItemsSource

I think this has been introduced in Xamarin.Forms 4.1.0.778454 (latest 4.1.0) so the last good version is 4.1.0.709244.

@sdarveau , I think the core of this bug is there for a long time. However, we also spotted our app started misbehaving after 4.2.X. Especially if you use Picker in DataTemplate (Example 2 above). As there is no workaround and there is no guidance on if and how it should actually work, we opted for not reusing ViewModel (VM).

In our case: Once a VM is attached to a ContentPage and ContentPage is about to be closed we save changes (if needed) before detaching BindingContext and throw away VM. Whenever you are reopening a ContentPage we recreate VM from persisted data again.

There is a performance impact (you need to reload data from SqlLite in our case). However, this seems to be robust enough to avoid nasty surprises. We actually had a production issue when after XForms nuget upgrade some users reopened a view, hit save again and voilà 'data is lost'.

@samhouts Do you need any help with this?

@milanio We're just waiting for time to review the PR. Are you able to confirm that it resolves your issue? Thanks!

@samhouts, sorry we decided against reusing VM. Basically we persist state before VM is detached and never reuse it again. So the bug is still there but we can't replicate the issue anymore.

I believe @DerGary PR does solve the issue only partially.

Can you get back to me on my reply above : https://github.com/xamarin/Xamarin.Forms/issues/7340#issuecomment-531770415

I think the issue will become much clearer if there is a reference on how it should actually work. Do you guys agree on the workflow I described above or do you want it to work differently?

If that will be clear, I'm happy to implement the changes and write tests.

@milanio you're right, my PR does not solve the issue. And I had no time in the past few weeks to look deeper into the issue. I also don't really know what the expected behavior is supposed to be. Someone from the xamarin team should answer this question.

However I believe that the three described cases do not cover the whole picture. I believe the Problem occurs because of the following mechanic :
The Bindings of the Properties ItemsSource, DisplayTextConverter and SelectedItem exist. When the BindingContext and therefore the ItemsSource changes the Picker does execute the Reset Method which resets the SelectedItem and SelectedIndex properties, but because the SelectedItem was already bound, it reflects the reset to the bound property, which then is null. The same happens if DisplayTextConverter changes.

I already tried to think about a solution but until now I didn't find one. Maybe it should check if the SelectedItem is part of the ItemsSource and if it is, it should not reset or something, but I don't know if this would break some other functionality.

To your cases: I don't think that the SelectedItem should never change when the ItemsSource changes. It should change if it is not part of the ItemsSource. And in the Case that I described above, the SelectedItem also changed because of the BindingContext changing, but it was not tracked and was only discarded, maybe there should be different handlers for BindingContext/ItemsSource/DisplayTextConverter changes, instead of using the same code for all of them.

@samhouts @jfversluis I think we are hitting dead-end here. We need your input. Or someone who has authority on how this should work. What is the desired behaviour?

I still think the current behaviour is a bug, because it leads to a lot of confusion. At least it should be somewhere clearly documented that detaching VM from View can change properties of VM. Therefore, it should be strongly advised not to reuse VMs and discard them.

Hey @milanio, thanks for all your time and effort on this. You are totally right. We need to decide how we want this to behave and then come up with a fix to end this once and for all. Let us discuss this a bit more internally on how we think this should behave and come back to you.

@samhouts, @jfversluis - Hi guys, there was no response from you on #7448 - Do you want me to look into this or not?

I run into the same issue with Xamarin Forms 4.5.0. Will this issue be fixed?

I have a gist that could help some people with this issue. In your xaml bind to CurrentItem and CurrentItems instead of SelectedItem and ItemsSource repectively.

I had to change the XAML order of where I declared SelectedItem.

Make sure to set ItemsSource in your XAML before setting SelectedItem.

@bizmonger you may find that that appears to work until you use the picker in a complex binding scenario like the CarouselView.

This occurs for me when using a Picker inside a CollectionView template. I bind the ItemsSource to a parent vm using FindAncestorBindingContext.

Xamarin then happily goes and sets the SelectedItem binding to null on my vms.

This occurs when the view becomes visible:

TimesheetElementVm.set_Role() at (snip)\OngoingTimesheetVm.cs:line 47 *throws argumentexception*
TimesheetEditor.<InitializeComponent>_anonXamlCDataTemplate_2.<LoadDataTemplate>typedBindingsM__63()
TypedBinding<TimesheetElementVm, ActiveStaffRole>.ApplyCore() at D:\a\1\s\Xamarin.Forms.Core\TypedBinding.cs:line 229
TypedBinding<TimesheetElementVm, ActiveStaffRole>.Apply() at D:\a\1\s\Xamarin.Forms.Core\TypedBinding.cs:line 108
BindableObject.SetValueActual() at D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:line 457 [3]
BindableObject.SetValueCore() at D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:line 397 [3]
BindableObject.SetValue() at D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:line 334 [2]
BindableObject.SetValue() at D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:line 311 [2]
Picker.set_SelectedItem() at D:\a\1\s\Xamarin.Forms.Core\Picker.cs:line 102
Picker.UpdateSelectedItem() at D:\a\1\s\Xamarin.Forms.Core\Picker.cs:line 267
Picker.OnItemsCollectionChanged() at D:\a\1\s\Xamarin.Forms.Core\Picker.cs:line 176
ObservableCollection<string>.OnCollectionChanged() at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:line 263
ObservableCollection<string>.OnCollectionReset() at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:line 362
ObservableCollection<string>.ClearItems() at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:line 166
Collection<string>.Clear() at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/Common/src/CoreLib/System/Collections/ObjectModel/Collection.cs:line 81
LockableObservableListWrapper.InternalClear() at D:\a\1\s\Xamarin.Forms.Core\LockableObservableListWrapper.cs:line 65
Picker.ResetItems() at D:\a\1\s\Xamarin.Forms.Core\Picker.cs:line 236
Picker.OnItemsSourceChanged() at D:\a\1\s\Xamarin.Forms.Core\Picker.cs:line 197
Picker.OnItemsSourceChanged() at D:\a\1\s\Xamarin.Forms.Core\Picker.cs:line 181
BindableObject.SetValueActual() at D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:line 463 [2]
BindableObject.SetValueCore() at D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:line 397 [2]
BindingExpression.ApplyCore() at D:\a\1\s\Xamarin.Forms.Core\BindingExpression.cs:line 155
BindingExpression.Apply() at D:\a\1\s\Xamarin.Forms.Core\BindingExpression.cs:line 72
Binding.ApplyAncestorTypeBinding() at D:\a\1\s\Xamarin.Forms.Core\Binding.cs:line 214 [2]
Binding.ApplyAncestorTypeBinding() at D:\a\1\s\Xamarin.Forms.Core\Binding.cs:line 222 [1]
Binding.<ApplyRelativeSourceBinding>d__28.MoveNext() at D:\a\1\s\Xamarin.Forms.Core\Binding.cs:line 168
AsyncVoidMethodBuilder.Start<<ApplyRelativeSourceBinding>d__28>() at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:line 84
Binding.ApplyRelativeSourceBinding()
Binding.Apply() at D:\a\1\s\Xamarin.Forms.Core\Binding.cs:line 133
BindingExpression.OnElementParentSet() at D:\a\1\s\Xamarin.Forms.Core\BindingExpression.cs:line 581
Element.OnParentSet() at D:\a\1\s\Xamarin.Forms.Core\Element.cs:line 346
NavigableElement.OnParentSet() at D:\a\1\s\Xamarin.Forms.Core\Shell\NavigableElement.cs:line 61
Element.set_Parent() at D:\a\1\s\Xamarin.Forms.Core\Element.cs:line 206
ItemsView.AddLogicalChild() at D:\a\1\s\Xamarin.Forms.Core\Items\ItemsView.cs:line 100
TemplatedItemViewHolder.Bind() at D:\a\1\s\Xamarin.Forms.Platform.Android\CollectionView\TemplatedItemViewHolder.cs:line 77
ItemsViewAdapter<GroupableItemsView, IGroupableItemsViewSource>.BindTemplatedItemViewHolder() at D:\a\1\s\Xamarin.Forms.Platform.Android\CollectionView\ItemsViewAdapter.cs:line 134
StructuredItemsViewAdapter<GroupableItemsView, IGroupableItemsViewSource>.BindTemplatedItemViewHolder() at D:\a\1\s\Xamarin.Forms.Platform.Android\CollectionView\StructuredItemsViewAdapter.cs:line 108
ItemsViewAdapter<GroupableItemsView, IGroupableItemsViewSource>.OnBindViewHolder() at D:\a\1\s\Xamarin.Forms.Platform.Android\CollectionView\ItemsViewAdapter.cs:line 78
StructuredItemsViewAdapter<GroupableItemsView, IGroupableItemsViewSource>.OnBindViewHolder() at D:\a\1\s\Xamarin.Forms.Platform.Android\CollectionView\StructuredItemsViewAdapter.cs:line 97
SelectableItemsViewAdapter<GroupableItemsView, IGroupableItemsViewSource>.OnBindViewHolder() at D:\a\1\s\Xamarin.Forms.Platform.Android\CollectionView\SelectableItemsViewAdapter.cs:line 27
GroupableItemsViewAdapter<GroupableItemsView, IGroupableItemsViewSource>.OnBindViewHolder() at D:\a\1\s\Xamarin.Forms.Platform.Android\CollectionView\GroupableItemsViewAdapter.cs:line 69
RecyclerView.Adapter.n_OnBindViewHolder_Landroid_support_v7_widget_RecyclerView_ViewHolder_I()
DynamicMethodNameCounter.38()
[Native Transition]
JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod() [5]
JniPeerMembers.JniInstanceMethods.InvokeVirtualVoidMethod() [3]
RecyclerView.OnLayout()
ItemsViewRenderer<GroupableItemsView, GroupableItemsViewAdapter<GroupableItemsView, IGroupableItemsViewSource>, IGroupableItemsViewSource>.OnLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android\CollectionView\ItemsViewRenderer.cs:line 68
RecyclerView.n_OnLayout_ZIIII()
DynamicMethodNameCounter.96()
[Native Transition]
JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod() [4]
JniPeerMembers.JniInstanceMethods.InvokeNonvirtualVoidMethod() [2]
ViewGroup.Layout() [2]
VisualElementTracker.UpdateLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementTracker.cs:line 105 [2]
ItemsViewRenderer<GroupableItemsView, GroupableItemsViewAdapter<GroupableItemsView, IGroupableItemsViewSource>, IGroupableItemsViewSource>.Xamarin.Forms.Platform.Android.IVisualElementRenderer.UpdateLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android\CollectionView\ItemsViewRenderer.cs:line 134
VisualElementRenderer<View>.UpdateLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:line 417 [2]
VisualElementRenderer<View>.OnLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:line 395 [2]
Platform.DefaultRenderer.OnLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:line 1313 [2]
FormsViewGroup.n_OnLayout_ZIIII() at D:\a\1\s\Xamarin.Forms.Platform.Android.FormsViewGroup\obj\Release\generated\src\Xamarin.Forms.Platform.Android.FormsViewGroup.cs:line 198 [2]
DynamicMethodNameCounter.68() [2]
[Native Transition]
JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod() [3]
JniPeerMembers.JniInstanceMethods.InvokeVirtualVoidMethod() [2]
FormsViewGroup.MeasureAndLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android.FormsViewGroup\obj\Release\generated\src\Xamarin.Forms.Platform.Android.FormsViewGroup.cs:line 181
VisualElementTracker.UpdateLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementTracker.cs:line 111 [1]
VisualElementRenderer<View>.UpdateLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:line 143
VisualElementRenderer<View>.UpdateLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:line 417 [1]
VisualElementRenderer<View>.OnLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:line 395 [1]
Platform.DefaultRenderer.OnLayout() at D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:line 1313 [1]
FormsViewGroup.n_OnLayout_ZIIII() at D:\a\1\s\Xamarin.Forms.Platform.Android.FormsViewGroup\obj\Release\generated\src\Xamarin.Forms.Platform.Android.FormsViewGroup.cs:line 198 [1]
DynamicMethodNameCounter.68() [1]
[Native Transition]
JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod() [2]
JniPeerMembers.JniInstanceMethods.InvokeNonvirtualVoidMethod() [1]
ViewGroup.Layout() [1]
ViewExtensions.ToAndroid()
CarouselViewRenderer.PageAdapter.InstantiateItem()
PagerAdapter.n_InstantiateItem_Landroid_view_ViewGroup_I()
DynamicMethodNameCounter.121()
[Native Transition]
JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod() [1]
JniPeerMembers.JniInstanceMethods.InvokeVirtualVoidMethod() [1]
ViewPager.SetCurrentItem()
CarouselViewRenderer.SetCurrentPage()
CarouselViewRenderer.OnElementPropertyChanged()
BindableObject.OnPropertyChanged() at D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:line 229
Element.OnPropertyChanged() at D:\a\1\s\Xamarin.Forms.Core\Element.cs:line 353
BindableObject.SetValueActual() at D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:line 461 [1]
BindableObject.SetValueCore() at D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:line 397 [1]
BindableObject.SetValue() at D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:line 334 [1]
BindableObject.SetValue() at D:\a\1\s\Xamarin.Forms.Core\BindableObject.cs:line 311 [1]
CarouselViewControl.set_Position()
TabViewControl.SetPosition()
TabViewControl.<>c__DisplayClass21_0.<AddTabToView>b__1()
TapGestureRecognizer.SendTapped() at D:\a\1\s\Xamarin.Forms.Core\TapGestureRecognizer.cs:line 48
TapGestureHandler.OnTap() at D:\a\1\s\Xamarin.Forms.Platform.Android\TapGestureHandler.cs:line 52
InnerGestureListener.Android.Views.GestureDetector.IOnGestureListener.OnSingleTapUp() at D:\a\1\s\Xamarin.Forms.Platform.Android\InnerGestureListener.cs:line 151
GestureDetector.IOnGestureListenerInvoker.n_OnSingleTapUp_Landroid_view_MotionEvent_()
DynamicMethodNameCounter.90()
[Native Transition]
JniEnvironment.InstanceMethods.CallNonvirtualBooleanMethod() [6]
JniPeerMembers.JniInstanceMethods.InvokeVirtualBooleanMethod() [6]
GestureDetector.OnTouchEvent()
GestureManager.TapAndPanGestureDetector.OnTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\GestureManager.cs:line 92
GestureManager.OnTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\GestureManager.cs:line 64
VisualElementRenderer<View>.OnTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:line 46
Platform.DefaultRenderer.OnTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:line 1230
Platform.DefaultRenderer.DispatchTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:line 1282 [4]
View.n_DispatchTouchEvent_Landroid_view_MotionEvent_() [6]
DynamicMethodNameCounter.25() [6]
[Native Transition]
JniEnvironment.InstanceMethods.CallNonvirtualBooleanMethod() [5]
JniPeerMembers.JniInstanceMethods.InvokeVirtualBooleanMethod() [5]
View.DispatchTouchEvent() [5]
VisualElementRenderer<View>.DispatchTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:line 72 [3]
Platform.DefaultRenderer.DispatchTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:line 1270 [3]
View.n_DispatchTouchEvent_Landroid_view_MotionEvent_() [5]
DynamicMethodNameCounter.25() [5]
[Native Transition]
JniEnvironment.InstanceMethods.CallNonvirtualBooleanMethod() [4]
JniPeerMembers.JniInstanceMethods.InvokeVirtualBooleanMethod() [4]
View.DispatchTouchEvent() [4]
VisualElementRenderer<View>.DispatchTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:line 72 [2]
Platform.DefaultRenderer.DispatchTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:line 1270 [2]
View.n_DispatchTouchEvent_Landroid_view_MotionEvent_() [4]
DynamicMethodNameCounter.25() [4]
[Native Transition]
JniEnvironment.InstanceMethods.CallNonvirtualBooleanMethod() [3]
JniPeerMembers.JniInstanceMethods.InvokeVirtualBooleanMethod() [3]
View.DispatchTouchEvent() [3]
VisualElementRenderer<View>.DispatchTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:line 72 [1]
Platform.DefaultRenderer.DispatchTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:line 1270 [1]
View.n_DispatchTouchEvent_Landroid_view_MotionEvent_() [3]
DynamicMethodNameCounter.25() [3]
[Native Transition]
JniEnvironment.InstanceMethods.CallNonvirtualBooleanMethod() [2]
JniPeerMembers.JniInstanceMethods.InvokeVirtualBooleanMethod() [2]
View.DispatchTouchEvent() [2]
VisualElementRenderer<Page>.DispatchTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:line 72
View.n_DispatchTouchEvent_Landroid_view_MotionEvent_() [2]
DynamicMethodNameCounter.25() [2]
[Native Transition]
JniEnvironment.InstanceMethods.CallNonvirtualBooleanMethod() [1]
JniPeerMembers.JniInstanceMethods.InvokeVirtualBooleanMethod() [1]
View.DispatchTouchEvent() [1]
PlatformRenderer.DispatchTouchEvent() at D:\a\1\s\Xamarin.Forms.Platform.Android\PlatformRenderer.cs:line 36
View.n_DispatchTouchEvent_Landroid_view_MotionEvent_() [1]
DynamicMethodNameCounter.25() [1]
Was this page helpful?
0 / 5 - 0 ratings