This repository has been archived by the owner on May 1, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[iOS] Null Element before disposing trial renderers in uneven ListVie…
…ws (#894) * Add repro for 55745 * [iOS] Null Element before disposing trial renderers
- Loading branch information
Showing
4 changed files
with
193 additions
and
4 deletions.
There are no files selected for viewing
174 changes: 174 additions & 0 deletions
174
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla55745.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,174 @@ | ||
using Xamarin.Forms.CustomAttributes; | ||
using Xamarin.Forms.Internals; | ||
using System.ComponentModel; | ||
using System.Collections.Generic; | ||
using System.Collections.ObjectModel; | ||
|
||
#if UITEST | ||
using Xamarin.UITest; | ||
using NUnit.Framework; | ||
#endif | ||
|
||
// Apply the default category of "Issues" to all of the tests in this assembly | ||
// We use this as a catch-all for tests which haven't been individually categorized | ||
#if UITEST | ||
[assembly: NUnit.Framework.Category("Issues")] | ||
#endif | ||
|
||
namespace Xamarin.Forms.Controls.Issues | ||
{ | ||
[Preserve(AllMembers = true)] | ||
[Issue(IssueTracker.Bugzilla, 55745, "[iOS] NRE in ListView with HasUnevenRows=true after changing content and rebinding", PlatformAffected.iOS)] | ||
public class Bugzilla55745 : TestContentPage | ||
{ | ||
const string ButtonId = "button"; | ||
ViewModel vm; | ||
|
||
protected override void Init() | ||
{ | ||
vm = new ViewModel(); | ||
BindingContext = vm; | ||
|
||
var listView = new ListView | ||
{ | ||
HasUnevenRows = true, | ||
ItemTemplate = new DataTemplate(() => | ||
{ | ||
var label1 = new Label(); | ||
label1.SetBinding(Label.TextProperty, nameof(DataViewModel.TextOne)); | ||
var label2 = new Label(); | ||
label2.SetBinding(Label.TextProperty, nameof(DataViewModel.TextTwo)); | ||
return new ViewCell { View = new StackLayout { Children = { label1, label2 } } }; | ||
}) | ||
}; | ||
|
||
listView.SetBinding(ListView.ItemsSourceProperty, nameof(vm.MyCollection)); | ||
|
||
var button = new Button { Text = "Tap me twice. The app should not crash.", AutomationId = ButtonId }; | ||
button.Clicked += Button_Clicked; | ||
|
||
Content = new StackLayout { Children = { button, listView } }; | ||
} | ||
|
||
void Button_Clicked(object sender, System.EventArgs e) | ||
{ | ||
vm.ToggleContent(); | ||
} | ||
|
||
[Preserve(AllMembers = true)] | ||
class DataViewModel : INotifyPropertyChanged | ||
{ | ||
string mTextOne; | ||
|
||
string mTextTwo; | ||
|
||
public event PropertyChangedEventHandler PropertyChanged; | ||
|
||
public string TextOne | ||
{ | ||
get { return mTextOne; } | ||
set | ||
{ | ||
mTextOne = value; | ||
OnPropertyChanged(nameof(TextOne)); | ||
} | ||
} | ||
|
||
public string TextTwo | ||
{ | ||
get { return mTextTwo; } | ||
set | ||
{ | ||
mTextTwo = value; | ||
OnPropertyChanged(nameof(TextTwo)); | ||
} | ||
} | ||
|
||
protected virtual void OnPropertyChanged(string propertyName) | ||
{ | ||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); | ||
} | ||
} | ||
|
||
[Preserve(AllMembers = true)] | ||
class ViewModel : INotifyPropertyChanged | ||
{ | ||
public List<DataViewModel> myList = new List<DataViewModel>() | ||
{ | ||
new DataViewModel() { TextOne = "Super", TextTwo = "Juuu"}, | ||
new DataViewModel() { TextOne = "Michael", TextTwo = "Maier"}, | ||
new DataViewModel() { TextOne = "House", TextTwo = "Cat"}, | ||
new DataViewModel() { TextOne = "Flower", TextTwo = "Rock"}, | ||
new DataViewModel() { TextOne = "Job", TextTwo = "Dog"}, | ||
new DataViewModel() { TextOne = "Super", TextTwo = "Juuu"}, | ||
new DataViewModel() { TextOne = "Michael", TextTwo = "Maier"}, | ||
new DataViewModel() { TextOne = "House", TextTwo = "Cat"}, | ||
new DataViewModel() { TextOne = "Flower", TextTwo = "Rock"}, | ||
new DataViewModel() { TextOne = "Job", TextTwo = "Dog"} | ||
}; | ||
|
||
ObservableCollection<DataViewModel> mMyCollection; | ||
|
||
DataViewModel mSelectedData; | ||
|
||
public ViewModel() | ||
{ | ||
MyCollection = new ObservableCollection<DataViewModel>(myList); | ||
} | ||
|
||
public event PropertyChangedEventHandler PropertyChanged; | ||
|
||
public ObservableCollection<DataViewModel> MyCollection | ||
{ | ||
get | ||
{ | ||
return mMyCollection; | ||
} | ||
set | ||
{ | ||
mMyCollection = value; | ||
OnPropertyChanged(nameof(MyCollection)); | ||
} | ||
} | ||
|
||
public DataViewModel SelectedData | ||
{ | ||
get { return mSelectedData; } | ||
set | ||
{ | ||
mSelectedData = value; | ||
OnPropertyChanged(nameof(SelectedData)); | ||
} | ||
} | ||
|
||
public void ToggleContent() | ||
{ | ||
if (MyCollection.Count < 3) | ||
{ | ||
MyCollection.Clear(); | ||
MyCollection = new ObservableCollection<DataViewModel>(myList); | ||
} | ||
else | ||
{ | ||
MyCollection.Clear(); | ||
MyCollection.Add(myList[2]); | ||
} | ||
} | ||
|
||
protected virtual void OnPropertyChanged(string propertyName) | ||
{ | ||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); | ||
} | ||
} | ||
|
||
#if UITEST | ||
[Test] | ||
public void Bugzilla55745Test() | ||
{ | ||
RunningApp.WaitForElement(q => q.Marked(ButtonId)); | ||
RunningApp.Tap(q => q.Marked(ButtonId)); | ||
RunningApp.Tap(q => q.Marked(ButtonId)); | ||
} | ||
#endif | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters