private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { if (e == null) { return; } var previousCol = _SelectedCascade; _SelectedCascade = (sender as DataTemplates.CascadeComponentXaml)?.Column ?? -1; ICard top = (_SelectedCascade >= 0) ? _Cards[_SelectedCascade].LastOrDefault() : CardEx.Empty; // card available to play of cascade (visually on bottom but called top) ICard previous = null; foreach (var c in _Cards?.SelectMany(z => z)?.Where(z => z.Selected)) { //if (c.Selected) previous = c; c.Selected = false; } previous = _SelectedCard; var current = e.CurrentSelection.FirstOrDefault() as ICard; if ((current != null) && (top == current)) // only allow top card in cascade to be selected { current.Selected = true; } if (previous == CardEx.Empty) { this.BackgroundColor = Color.Gray; // nothing previously selected } else if (previous == current) { this.BackgroundColor = Color.Gray; // same card } else if (previous.CanBePlacedOnSingle(current)) { this.BackgroundColor = Color.Green; // move is valid } else { this.BackgroundColor = Color.Yellow; // invalid move } _SelectedCard = current; RefreshView(); }