Jednoduchý Lazy Loading u TabItemu ve WPF


Jak na jednoduché řešení Lazy Loadingu na straně GUI ve WPF u TabItemu?

Abych byl přesný, tak se jedná spíš o načtení obsahu TabItemu až v případě prvního vybraní.

Základem je myšlenka, že obsah TabItemu, v našem případě DataGrid, se nebude definovat v Contentu TabItemu, ale v Resources…


    <TabControl.Resources>
      <DataGrid x:Key="PersonsDataGrid" ItemsSource="{Binding}">
        <DataGrid.Columns>
          <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
          <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
          <DataGridTextColumn Header="Birth Day" Binding="{Binding BirthDay}" />
        </DataGrid.Columns>
      </DataGrid>
    </TabControl.Resources>

…, pak je možné využít na TabItemu událost Selected pomocí definice přes Selector…


    <TabControl>
      <TabControl.Resources>
        ...
      </TabControl.Resources>
      <TabItem Header="Normal">

      </TabItem>
      <TabItem Name="u_LazyTabItem" Header="Lazy" Selector.Selected="TabItem_Selected" />
    </TabControl>

… a v samotné události načíst obsah TabItemu z Resources pokud je prázdný .


    private void TabItem_Selected(object sender, RoutedEventArgs e)
    {
      if (u_LazyTabItem.Content == null)
        u_LazyTabItem.Content = u_LazyTabItem.TryFindResource("PersonsDataGrid");
    }

Nebo ještě lépe k DataGridu v kódu přistupovat přes v property, pomocí které je možné pak s DataGridem pracovat. Akorát pozor, v tom případě inicializuje DataGrid v property její první volání/použití:


    private DataGrid _personsDataGrid;

    public DataGrid PersonsDataGrid
    {
      get { return _personsDataGrid ?? (_personsDataGrid = u_LazyTabItem.TryFindResource("PersonsDataGrid") as DataGrid); }
    }


    private void TabItem_Selected(object sender, RoutedEventArgs e)
    {
      if (u_LazyTabItem.Content == null)
        u_LazyTabItem.Content = PersonsDataGrid;
    }

Samozřejmě tento jednoduchý návrh má smysl v případě použití v kombinaci např. s Lazy Loadingem z Entity Frameworku apod. a pro velké množství dat, či GUI náročné na vykreslení atd…

, , , ,

Komentáře jsou uzavřeny.