Crear un SearchCommand en wpf usando Mvvm que carga nuevos datos en mi vista de lista

Podría usar un poco de ayuda, tratando de entender cómo funcionan los comandos en Wpf con Mvvm y cómo se le asigna un botón. He leído muchos artículos sobre comandos y wpf, pero todos parecen ser diferentes.

He creado un proyecto wpf usando el patrón mvvm. Tenga una vista de lista que se llenará de clientes.

Ahora quiero hacer un comando de búsqueda, para poder cambiar los datos en la vista de lista.

CustomerViewModel

public class CustomerViewModel : INotifyPropertyChanged, ICommand
{
    private List<Customer> CustomerList;

    public CustomerViewModel()
    {
        CustomerList = LoadCustomerData();
    }

    public List<Customer> LoadCustomerData()
    {
        List<Customer> data = new List<Customer>();
        data.Add(new Customer() { Id = 1, FirstName = "Alexander", LastName = "Malkovich", PhoneNumber = "43215678", Email = "[email protected]" });
        data.Add(new Customer() { Id = 2, FirstName = "Mikkel", LastName = "Larsen", PhoneNumber = "87654321", Email = "[email protected]" });

        return data;
    }

    public List<Customer> CustomerDataLoadedOnSearch()
    {
        List<Customer> data = new List<Customer>();
        data.Add(new Customer() { Id = 1, FirstName = "Ulrik", LastName = "Trissel", PhoneNumber = "35325235", Email = "[email protected]" });
        data.Add(new Customer() { Id = 2, FirstName = "Michael", LastName = "Mortensen", PhoneNumber = "14214124", Email = "[email protected]" });

        return data;
    }

    public List<Customer> Customer
    {
        get
        {
            return CustomerList;

        }

    }

    // Search Command


    #region INotifyPropertyChanged members

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion

}

Básicamente ejecuto LoadCustomerData () en el ctor, y obtengo CustomerList con el método get.

Estoy tratando de crear un comando de búsqueda, que ejecutará el otro método (CustomerDataLoadedOnSearch), y luego activará la llamada de nuevo en la vista.

Código de vista XML:

<StackPanel Orientation="Vertical">
            <Button Command="{Binding SearchCommand}" Padding="15, 5" HorizontalAlignment="Right">Search</Button>
        </StackPanel>
        <GroupBox Header="Customers">
            <StackPanel Margin="10, 10" Orientation="Vertical">
                <ListView Height="250" Width="Auto" ItemsSource="{Binding Customer}" Grid.Row="1">
                    <ListView.View>
                        <GridView >
                            <GridViewColumn Header="ID" Width="Auto">
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Id}" TextAlignment="Right" Width="40"/>
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                            <GridViewColumn DisplayMemberBinding="{Binding FirstName}" Header="First name" Width="100"/>
                            <GridViewColumn DisplayMemberBinding="{Binding LastName}" Header="Last name" Width="100"/>
                            <GridViewColumn DisplayMemberBinding="{Binding PhoneNumber}" Header="Phone" Width="100"/>
                            <GridViewColumn DisplayMemberBinding="{Binding Email}" Header="Email" Width="200"/>
                        </GridView>
                    </ListView.View>
                </ListView>
            </StackPanel>
        </GroupBox>

He vinculado un comando llamado SearchCommand. Ahora no estoy tan seguro de qué hacer a continuación. ¿Debo crear una carpeta llamada Comando y mantener todos los comandos allí para todos los botones que hago?

¿O debería mantener todo el código ICommand en ViewModel? Espero que alguien pueda mostrarme cómo funciona esto.

Buen día.

Actualizar:

Hasta ahora, gracias por sus respuestas.

Logré implementar la clase ViewModelBase & RelayCommand. Además, he implementado el comando I del botón de búsqueda, pero cuando hago clic en él, borra la lista (la vista pierde sus clientes).

void SearchCommand_DoWork(object obj)
{
     CustomerList.Clear();
     CustomerList = CustomerDataLoadedOnSearch();            
}

He depurado CustomerList y cuando llamo CustomerDataLoadedOnSearch, tiene dos filas con nuevos clientes dentro, pero la lista no se ha completado.

Respuestas a la pregunta(1)

Su respuesta a la pregunta