/// <summary>
        /// Handle the filter button click.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnFilterButtonClick(object sender, RoutedEventArgs args)
        {
            MainWindowDataContext dataContext = (MainWindowDataContext)DataContext;

            dataContext.IsFilterActive = true;

            // Sort data and then search by name
            PropertyInfo filterProperty = (PropertyInfo)PropertySortComboBox.SelectedItem;
            MemberTab    tab            = (MemberTab)MemberTypeTabControl.SelectedItem;

            bool sortAscending = SortAscendingCheckbox.IsChecked != null && SortAscendingCheckbox.IsChecked.Value;

            // Local predicate function to facilitate order-by property
            object SortSelector(Member element) => filterProperty.GetValue(element, null);

            IEnumerable <Member> filterData = sortAscending ? tab.Data.OrderBy(SortSelector) : tab.Data.OrderByDescending(SortSelector);

            string nameQuery = SearchTextbox.Text.ToLower();

            if (!string.IsNullOrEmpty(nameQuery))
            {
                // Check if the first name, last name, first + last name, or last + first name contain the query string
                filterData = filterData.Where(element => element.FirstName.ToLower().Contains(nameQuery) ||
                                              element.LastName.ToLower().Contains(nameQuery) ||
                                              string.Join(" ", element.LastName, element.FirstName).ToLower().Contains(nameQuery) ||
                                              string.Join(" ", element.FirstName, element.LastName).ToLower().Contains(nameQuery));
            }

            DataGrid membersDataGrid = (DataGrid)MemberTypeTabControl.GetChildren().Find(control => control is DataGrid);

            membersDataGrid.ItemsSource = filterData;
        }
        /// <summary>
        /// Handle the delete member button click event.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnDeleteMemberButton(object sender, RoutedEventArgs args)
        {
            Team      team      = (Team)TeamSelectionComboBox.SelectedItem;
            MemberTab memberTab = (MemberTab)MemberTypeTabControl.SelectedItem;

            // Find a child data-grid of the tab control
            DataGrid membersDataGrid = (DataGrid)MemberTypeTabControl.GetChildren().Find(control => control is DataGrid);

            // If we haven't selecting anything in the data grid, we can't remove anything
            if (membersDataGrid.SelectedItem == null)
            {
                return;
            }

            int currentSelectedIndex = membersDataGrid.SelectedIndex;

            team.RemoveMember(memberTab.MemberType, (Member)membersDataGrid.SelectedItem);

            if (currentSelectedIndex == membersDataGrid.Items.Count)
            {
                currentSelectedIndex -= 1;
            }

            membersDataGrid.SelectedIndex = currentSelectedIndex;
        }
        /// <summary>
        /// Handle the clear filter button click.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnClearFilterButtonClick(object sender, RoutedEventArgs args)
        {
            MainWindowDataContext dataContext = (MainWindowDataContext)DataContext;

            dataContext.IsFilterActive = false;

            MemberTab tab             = (MemberTab)MemberTypeTabControl.SelectedItem;
            DataGrid  membersDataGrid = (DataGrid)MemberTypeTabControl.GetChildren().Find(control => control is DataGrid);

            membersDataGrid.ItemsSource = tab.Data;
        }
        /// <summary>
        /// Handle the new member button click event.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnNewMemberButton(object sender, RoutedEventArgs args)
        {
            Team      team      = (Team)TeamSelectionComboBox.SelectedItem;
            MemberTab memberTab = (MemberTab)MemberTypeTabControl.SelectedItem;

            Member newMember = (Member)Activator.CreateInstance(memberTab.MemberType);

            team.AddMember(memberTab.MemberType, newMember);

            // Find a child data-grid of the tab control
            DataGrid membersDataGrid = (DataGrid)MemberTypeTabControl.GetChildren().Find(control => control is DataGrid);

            membersDataGrid.SelectedItem = newMember;
            membersDataGrid.ScrollIntoView(newMember);
        }
        /// <summary>
        /// Handle the type selection changed.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnTypeSelectionChanged(object sender, SelectionChangedEventArgs args)
        {
            // Find a child data-grid of the tab control
            DataGrid membersDataGrid = (DataGrid)MemberTypeTabControl.GetChildren().Find(control => control is DataGrid);

            if (membersDataGrid.SelectedItem == null)
            {
                return;
            }

            Type   newType = (Type)TypeSelectionComboBox.SelectedItem;
            Member member  = (Member)membersDataGrid.SelectedItem;

            // No change in type means that we don't need to do anything
            if (newType == member.GetType())
            {
                return;
            }
            Team team = (Team)TeamSelectionComboBox.SelectedItem;

            // Remove the member from the old type and move it to the new type collection in the team member map
            team.RemoveMember(member.GetType(), member);

            // Convert the member to its respective type via casting
            Member newMember = new Member();

            if (newType == typeof(Wrestler))
            {
                newMember = new Wrestler();
            }
            else if (newType == typeof(Coach))
            {
                newMember = new Coach();
            }

            // Copy the values from the old member to the converted member
            newMember.FirstName         = member.FirstName;
            newMember.LastName          = member.LastName;
            newMember.Gender            = member.Gender;
            newMember.School            = member.School;
            newMember.YearsOfExperience = member.YearsOfExperience;

            team.AddMember(newType, newMember);
        }