WPF e MVVM: carregando listas para tabcontrols na hora certa.

Quando você exibe os dados de um objeto em um tabcontrol que mostra no primeiro tabitem os detalhes do objeto e em outros tabitens exibe listas contendo informações relacionadas ao objeto, não é interessante que as listas sejam carregadas logo que o formulário é criado, mas somente no caso do usuário clicar no tabitem correspondente. Principalmente se o número de listas for grande, o que faria com que o formulário tivesse sua carga muito demorada.

No WPF, podemos ligar a propriedade IsSelected de cada tabitem a uma propriedade do objeto atribuído ao DataContext do formulário. Na primeira vez que o usuário clicar no tabitem, o valor desta propriedade será mudado para true e poderemos então carregar a lista que será exibida no tabitem. Na verdade, o que recomendo é ter uma variável à parte da variável usada para manter o valor da propriedade ligada a IsSelected. No procedimento "set" da propriedade ligada, esta segunda variável é posta em true se ainda não o foi e a lista é carregada. Caso ela já esteja em true, a lista não precisa ser carregada novamente. Veja um exemplo abaixo.

No XAML:

<TabControl Name="TControl">
   <TabItem Name="TbItem1" IsSelected="{Binding ElementName=TControl, Path=DataContext.TbItem1_IsSelected}" DataContext="{Binding ListaClientes}">
   </TabItem>
</TabControl>

No código C# da classe do DataContext do form:

private bool _TbItem1_WasSelected;
private bool _TbItem1_IsSelected;
public bool TbItem1_IsSelected
{
    get
    {
       return _TbItem1_IsSelected;
    }
    set
    {
        _TbItem1_IsSelected = value;
         OnPropertyChanged("TbItem1_IsSelected;");
         if (_TbItem1_WasSelected == false && value == true)
         {
            _TbItem1_WasSelected = value;
           // abaixo, dispara o PropertyChanged para que
           // as partes do programa interessadas 
           // na inicialização de ListaClientes chamem
           // o procedimento get de ListaClientes, o que
           // fará agora que ela seja inicializada.
             OnPropertyChanged("ListaClientes");
         }
    }
}

private List<Cliente> _ListaClientes;
public List<Cliente> ListaClientes
{
    get
    {
       if (_ListaClientes == null && _TbItem1_WasSelected)
       {
           _ListaClientes = BuscaListaClientes();
       }
       return _ListaClientes; 
    }
    set
    {
       _ListaClientes = value;
       OnPropertyChanged("ListaClientes");
    }
}

PS.: no código acima, está pressuposto que a classe do DataContext implementa INotifyPropertyChanged e tem um método "OnPropertyChanged" que dispara o evento PropertyChanged.