From 83c1bc624a7570415413c8d4545cadfc91275606 Mon Sep 17 00:00:00 2001 From: bstraub Date: Wed, 8 May 2019 12:29:04 +0200 Subject: [PATCH] Add initial sample --- .../CollectionViewChallenge.Android.csproj | 5 +- .../Properties/AndroidManifest.xml | 8 +-- .../CollectionViewChallenge.iOS.csproj | 4 +- .../CollectionViewChallenge.csproj | 6 +- .../ViewModels/ViewModel.cs | 53 +++++++++++++++++ .../Views/CollectionViewChallengePage.xaml | 58 ++++++++++++++----- .../Views/CollectionViewChallengePage.xaml.cs | 49 +++++++++++++++- 7 files changed, 154 insertions(+), 29 deletions(-) create mode 100644 CollectionViewChallenge/CollectionViewChallenge/ViewModels/ViewModel.cs diff --git a/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj b/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj index d2c42fc..2504305 100644 --- a/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj +++ b/CollectionViewChallenge/CollectionViewChallenge.Android/CollectionViewChallenge.Android.csproj @@ -15,7 +15,6 @@ Properties\AndroidManifest.xml Resources Assets - false v8.1 true Xamarin.Android.Net.AndroidClientHandler @@ -52,7 +51,7 @@ - + @@ -102,7 +101,7 @@ - {BA39825E-3CF8-4A31-B120-782B2A651542} + {9A9DDEE5-8C48-4274-82D7-22EB79C97206} CollectionViewChallenge diff --git a/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml b/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml index 8a8223a..0a62e2d 100644 --- a/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml +++ b/CollectionViewChallenge/CollectionViewChallenge.Android/Properties/AndroidManifest.xml @@ -1,5 +1,5 @@ - + - - - + + + \ No newline at end of file diff --git a/CollectionViewChallenge/CollectionViewChallenge.iOS/CollectionViewChallenge.iOS.csproj b/CollectionViewChallenge/CollectionViewChallenge.iOS/CollectionViewChallenge.iOS.csproj index 49a7105..7210c40 100644 --- a/CollectionViewChallenge/CollectionViewChallenge.iOS/CollectionViewChallenge.iOS.csproj +++ b/CollectionViewChallenge/CollectionViewChallenge.iOS/CollectionViewChallenge.iOS.csproj @@ -133,13 +133,13 @@ - + - {BA39825E-3CF8-4A31-B120-782B2A651542} + {9A9DDEE5-8C48-4274-82D7-22EB79C97206} CollectionViewChallenge diff --git a/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj b/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj index 3ccfc60..0988662 100644 --- a/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj +++ b/CollectionViewChallenge/CollectionViewChallenge/CollectionViewChallenge.csproj @@ -11,8 +11,12 @@ - + + + + + diff --git a/CollectionViewChallenge/CollectionViewChallenge/ViewModels/ViewModel.cs b/CollectionViewChallenge/CollectionViewChallenge/ViewModels/ViewModel.cs new file mode 100644 index 0000000..920f434 --- /dev/null +++ b/CollectionViewChallenge/CollectionViewChallenge/ViewModels/ViewModel.cs @@ -0,0 +1,53 @@ +using System; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Linq; +using NLipsum.Core; + +namespace CollectionViewChallenge +{ + public class ViewModel : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + public String Column1 { get; set; } = String.Empty; + public String Column2 { get; set; } = String.Empty; + + LipsumGenerator lipsum = new LipsumGenerator(); + Random random = new Random(DateTime.Now.Millisecond); + bool collapsed = false; + + public ViewModel() + { + CreateRandomText(); + } + + public void Toggle() + { + collapsed = !collapsed; + CreateRandomText(); + } + + void CreateRandomText() + { + if (collapsed) + { + Column1 = "Tap to create random Text!"; + Column2 = String.Empty; + } + else + { + var words = lipsum.GenerateWords(random.Next(5, 50)); + var text = String.Join(" ", words.ToArray()); + + Column1 = text; + + words = lipsum.GenerateWords(random.Next(2, 20)); + text = String.Join(" ", words.ToArray()); + + Column2 = text; + } + } + + } +} \ No newline at end of file diff --git a/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml b/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml index f2da7f7..a83612f 100644 --- a/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml +++ b/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml @@ -1,31 +1,57 @@ - + + + + + - - - - - This is a CollectionView! - Your feedback on the experience of converting a ListView to a CollectionView is incredibly appreciated. - Here are three general questions: - 1. How was the experience of converting your existing ListView to a CollectionView? - 2. How is the performance compared to the ListView? - 3. Is there a specific piece of functionality that you'd like to see? - - + - - + + + + + + + + + + + + + + diff --git a/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml.cs b/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml.cs index 701124f..1665bd6 100644 --- a/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml.cs +++ b/CollectionViewChallenge/CollectionViewChallenge/Views/CollectionViewChallengePage.xaml.cs @@ -3,6 +3,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using DynamicData; +using DynamicData.Binding; using Xamarin.Forms; using Xamarin.Forms.Xaml; @@ -12,9 +14,50 @@ namespace CollectionViewChallenge.Views [XamlCompilation(XamlCompilationOptions.Compile)] public partial class CollectionViewChallengePage : ContentPage { - public CollectionViewChallengePage() + public IObservableCollection Data { get; } = new ObservableCollectionExtended(); + SourceList List = new SourceList(); + + public CollectionViewChallengePage() { InitializeComponent(); - } - } + + List.AddRange(Enumerable.Range(0, 1000).Select(x => new ViewModel())); + List.Connect().Bind(Data).DisposeMany().Subscribe(); + + BindingContext = this; + } + + void OnClearClicked(object sender, EventArgs e) + { + // verify that PropertyChanged interface works + Data.PropertyChanged += (sn, ev) => + { + Console.WriteLine("Data changed"); + }; + + List.Clear(); + } + + void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (e.CurrentSelection.Count == 0) + return; + + var item = e.CurrentSelection.FirstOrDefault() as ViewModel; + item.Toggle(); + var colView = sender as CollectionView; + UpdateSelection(colView, item); + } + + async void UpdateSelection(CollectionView colView, ViewModel item) + { + TBUpdating.Text = "Updating Selection ..."; + + await Task.Delay(1000); // make scroll action visible + colView.ScrollTo(item, position: ScrollToPosition.Center); + colView.SelectedItem = null; + + TBUpdating.Text = String.Empty; + } + } } \ No newline at end of file