diff options
author | Samantha Houts <samantha@teamredwall.com> | 2016-07-01 13:51:38 -0700 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2016-07-01 21:51:38 +0100 |
commit | eb84f968f2fac47c375724465854e58c85e45bee (patch) | |
tree | 64d9ded58234602c4bdea1e706db6e0f9ba90c3c /Xamarin.Forms.Controls.Issues | |
parent | 128796e6d0c6bc4c48ba3b6de4ca97a33d698724 (diff) | |
download | xamarin-forms-eb84f968f2fac47c375724465854e58c85e45bee.tar.gz xamarin-forms-eb84f968f2fac47c375724465854e58c85e45bee.tar.bz2 xamarin-forms-eb84f968f2fac47c375724465854e58c85e45bee.zip |
[All] Crash fixes for ListViews (#243)
* [Controls] Add repro for 42277
* [Android] No crash if GroupHeaderTemplate=null
* [Android] Fix DataTemplateSelector crash
* [Core] Expose ListProxy on TIL
* [iOS] Fix DataTemplateSelector crash
* [Win] Fix DataTemplateSelector crash
* [Docs] Update docs
* [Core] Implement ListProxy explicitly
Allows ListProxy property to stay internal.
* [Controls] Revert unnecessary change to shproj
Diffstat (limited to 'Xamarin.Forms.Controls.Issues')
2 files changed, 122 insertions, 0 deletions
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42277.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42277.cs new file mode 100644 index 00000000..1a7624ae --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla42277.cs @@ -0,0 +1,121 @@ +using System; +using System.Linq; +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; +using System.Collections.Generic; + +#if UITEST +using Xamarin.UITest; +using NUnit.Framework; +#endif + +namespace Xamarin.Forms.Controls +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Bugzilla, 42277, "DataTemplate System.InvalidCastException crash in 2.3.1-pre1")] + public class Bugzilla42277 : TestContentPage + { + const string Success1 = "Success1"; + const string Success2 = "Success2"; + const string Success3 = "GroupedSuccess3"; + const string Success4 = "GroupedSuccess4"; + const string Success5 = "GroupedSuccess5"; + const string Success6 = "GroupedSuccess6"; + + class MyDataTemplateSelector : DataTemplateSelector + { + DataTemplate _1Template; + DataTemplate _2Template; + + DataTemplate _3Template; + DataTemplate _4Template; + DataTemplate _5Template; + DataTemplate _6Template; + + public MyDataTemplateSelector() + { + _1Template = new DataTemplate(() => + { + return new TextCell { Text = Success1 }; + }); + + _2Template = new DataTemplate(() => + { + return new TextCell { Text = Success2 }; + }); + + _3Template = new DataTemplate(() => + { + return new TextCell { Text = Success3 }; + }); + + _4Template = new DataTemplate(() => + { + return new TextCell { Text = Success4 }; + }); + + _5Template = new DataTemplate(() => + { + return new TextCell { Text = Success5 }; + }); + + _6Template = new DataTemplate(() => + { + return new TextCell { Text = Success6 }; + }); + } + + protected override DataTemplate OnSelectTemplate(object item, BindableObject container) + { + int number = (int)item; + switch (number) + { + default: + case 0: return _1Template; + case 1: return _2Template; + case 2: return _3Template; + case 3: return _4Template; + case 4: return _5Template; + case 5: return _6Template; + } + } + } + + protected override void Init() + { + //test non-grouped DTS + ListView listView = new ListView(ListViewCachingStrategy.RecycleElement) + { + ItemsSource = Enumerable.Range(0, 2), + ItemTemplate = new MyDataTemplateSelector() + }; + + //test grouped DTS + ListView groupedListView = new ListView(ListViewCachingStrategy.RecycleElement) + { + ItemsSource = new List<List<int>> { Enumerable.Range(2, 2).ToList(), Enumerable.Range(4, 2).ToList() }, + IsGroupingEnabled = true, + ItemTemplate = new MyDataTemplateSelector() + }; + + Content = new StackLayout { Children = { listView, groupedListView } }; + + //test collection changed + listView.ItemsSource = Enumerable.Range(0, 2); + groupedListView.ItemsSource = new List<List<int>> { Enumerable.Range(2, 2).ToList(), Enumerable.Range(4, 2).ToList() }; + } + +#if UITEST + [Test] + public void Bugzilla42277Test() + { + RunningApp.WaitForElement(q => q.Marked(Success1)); + RunningApp.WaitForElement(q => q.Marked(Success2)); + RunningApp.WaitForElement(q => q.Marked(Success3)); + RunningApp.WaitForElement(q => q.Marked(Success4)); + RunningApp.WaitForElement(q => q.Marked(Success5)); + RunningApp.WaitForElement(q => q.Marked(Success6)); + } +#endif + } +} diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems index 919d5062..10e0800c 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems @@ -156,6 +156,7 @@ <Compile Include="$(MSBuildThisFileDirectory)Bugzilla39853.cs" /> <Compile Include="$(MSBuildThisFileDirectory)TestPages\ScreenshotConditionalApp.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla41842.cs" /> + <Compile Include="$(MSBuildThisFileDirectory)Bugzilla42277.cs" /> <Compile Include="$(MSBuildThisFileDirectory)_Template.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Issue1028.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Issue1075.cs" /> |