diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/materialdesignicons-webfont.ttf b/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/materialdesignicons-webfont.ttf
new file mode 100644
index 0000000..569f59e
Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Assets/materialdesignicons-webfont.ttf differ
diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj b/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj
index 82e6221..229af4c 100644
--- a/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj
+++ b/CarouselViewChallenge/CarouselViewChallenge.Android/CarouselViewChallenge.Android.csproj
@@ -63,6 +63,7 @@
+
@@ -100,5 +101,23 @@
CarouselViewChallenge
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/London.jpg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/London.jpg
new file mode 100644
index 0000000..a00c880
Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/London.jpg differ
diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Restaurant.jpeg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Restaurant.jpeg
new file mode 100644
index 0000000..7d049b4
Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Restaurant.jpeg differ
diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Seattle.jpg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Seattle.jpg
new file mode 100644
index 0000000..9e2656d
Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Seattle.jpg differ
diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Sight.jpeg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Sight.jpeg
new file mode 100644
index 0000000..1cab635
Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Sight.jpeg differ
diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Zurich.jpg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Zurich.jpg
new file mode 100644
index 0000000..4e3e894
Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/Zurich.jpg differ
diff --git a/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/ZurichLandmark.jpg b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/ZurichLandmark.jpg
new file mode 100644
index 0000000..7ff86f2
Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.Android/Resources/drawable/ZurichLandmark.jpg differ
diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj b/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj
index 155cd56..2743390 100644
--- a/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj
+++ b/CarouselViewChallenge/CarouselViewChallenge.iOS/CarouselViewChallenge.iOS.csproj
@@ -65,6 +65,7 @@
+
diff --git a/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/materialdesignicons-webfont.ttf b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/materialdesignicons-webfont.ttf
new file mode 100644
index 0000000..569f59e
Binary files /dev/null and b/CarouselViewChallenge/CarouselViewChallenge.iOS/Resources/materialdesignicons-webfont.ttf differ
diff --git a/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj b/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj
index 198ec7f..5435aa8 100644
--- a/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj
+++ b/CarouselViewChallenge/CarouselViewChallenge/CarouselViewChallenge.csproj
@@ -6,12 +6,14 @@
-
-
+
+
+
-
+
+
diff --git a/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewModel.cs b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewModel.cs
new file mode 100644
index 0000000..3ab27a5
--- /dev/null
+++ b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/CarouselViewModel.cs
@@ -0,0 +1,136 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using Xamarin.Forms;
+
+namespace CarouselViewChallenge.ViewModels
+{
+ public class CarouselViewModel : BaseViewModel
+ {
+ public CarouselViewModel()
+ {
+ _cities = new ObservableCollection
+ {
+ new City
+ {
+ CityImage = "London",
+ CityName = "London",
+ Country = "UK",
+ IsFavorite = false,
+ },
+ new City
+ {
+ CityImage = "Zurich",
+ CityName = "Zurich",
+ Country = "Switzerland",
+ IsFavorite = true,
+ },
+ new City
+ {
+ CityImage = "Seattle",
+ CityName = "Seattle",
+ Country = "USA",
+ IsFavorite = false,
+ },
+ };
+ Index = "1";
+ }
+
+ private ObservableCollection _cities;
+ private City _currentCity;
+ private string _index;
+
+ public ObservableCollection Cities
+ {
+ get
+ {
+ return _cities;
+ }
+ set
+ {
+ if (_cities != value)
+ {
+ _cities = value;
+ OnPropertyChanged(nameof(Cities));
+ }
+ }
+ }
+
+ public string Index
+ {
+ get => _index; set
+ {
+ _index = value;
+
+ OnPropertyChanged(nameof(Index));
+ }
+ }
+
+ public City CurrentCity
+ {
+ get
+ {
+ return _currentCity;
+ }
+ set
+ {
+ _currentCity = value;
+ var index = Cities.IndexOf(_currentCity);
+ Index = (index + 1).ToString();
+ OnPropertyChanged(nameof(CurrentCity));
+ }
+ }
+ }
+
+ public class City : BaseViewModel, IEquatable
+ {
+ private bool _isFavorite;
+
+ public City()
+ {
+ ChangeFavoriteStatus = new Command(() => IsFavorite = !IsFavorite);
+ }
+
+ public string CityImage { get; set; }
+ public string CityName { get; set; }
+ public string Country { get; set; }
+ public string FavoriteIcon => IsFavorite ? "\uf2d1" : "\uf2d5";
+ public bool IsFavorite
+ {
+ get => _isFavorite;
+ set
+ {
+ _isFavorite = value;
+ OnPropertyChanged(nameof(FavoriteIcon));
+ }
+ }
+
+ public Command ChangeFavoriteStatus { get; set; }
+
+ public override bool Equals(object obj)
+ {
+ return Equals(obj as City);
+ }
+
+ public bool Equals(City other)
+ {
+ return other != null &&
+ CityImage == other.CityImage &&
+ CityName == other.CityName &&
+ Country == other.Country &&
+ IsFavorite == other.IsFavorite &&
+ EqualityComparer.Default.Equals(ChangeFavoriteStatus, other.ChangeFavoriteStatus);
+ }
+
+ public override int GetHashCode()
+ {
+ var hashCode = -870885539;
+ hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(CityImage);
+ hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(CityName);
+ hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Country);
+ hashCode = hashCode * -1521134295 + IsFavorite.GetHashCode();
+ hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ChangeFavoriteStatus);
+ return hashCode;
+ }
+ }
+}
diff --git a/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs
index fdaa195..e7df887 100644
--- a/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs
+++ b/CarouselViewChallenge/CarouselViewChallenge/ViewModels/WelcomePageViewModel.cs
@@ -14,9 +14,17 @@ public class Section
public string Emoji { get; set; }
};
- public class WelcomePageViewModel : INotifyPropertyChanged
+ public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
+ protected void OnPropertyChanged(string propertyName)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+
+ public class WelcomePageViewModel : BaseViewModel
+ {
private ObservableCollection _sections;
public ObservableCollection Sections
@@ -30,14 +38,10 @@ public ObservableCollection Sections
if (_sections != value)
{
_sections = value;
- OnPropertyChanged(new PropertyChangedEventArgs("Sections"));
+ OnPropertyChanged(nameof(Sections));
}
}
}
- private void OnPropertyChanged(PropertyChangedEventArgs eventArgs)
- {
- PropertyChanged?.Invoke(this, eventArgs);
- }
}
}
diff --git a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml
index 1a7cc0d..3429386 100644
--- a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml
+++ b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml
@@ -5,9 +5,104 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="CarouselViewChallenge.Views.CarouselViewChallengePage">
+
+ Black
+ #B5B5B5
+ White
+ #FFBF00
+ #FAACC1
+
+ #xf349;
+ #xf4ce;
+ #xf2d1;
+ #xf2d5;
+
+ 22
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml.cs b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml.cs
index 38f2e9f..39a9d96 100644
--- a/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml.cs
+++ b/CarouselViewChallenge/CarouselViewChallenge/Views/CarouselViewChallengePage.xaml.cs
@@ -1,4 +1,5 @@
-using System;
+using CarouselViewChallenge.ViewModels;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -15,6 +16,7 @@ public partial class CarouselViewChallengePage : ContentPage
public CarouselViewChallengePage()
{
InitializeComponent();
+ BindingContext = new CarouselViewModel();
}
}
}
\ No newline at end of file