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.