Skip to main content

WPF Tutorial - Binding to a TabControl

Here's a very basic scenario - you've got a collection of items and you'd like to display a tab for each one inside a TabControl. The TabControl exposes a property called ItemsSource, however setting up the templates to control how to display your data is not quite as straight forward as you might think.
The example data we're going to work with today are reviews for the movie Inception. First we need a class to represent a review.
/// <summary>
/// Class representing a single movie review.
/// </summary>
public class Review
{
  /// <summary>
  /// The name of the critic who provided the review.
  /// </summary>
  public string Critic { get; set; }

  /// <summary>
  /// A snippet of the critic's full review.
  /// </summary>
  public string ReviewSnippet { get; set; }

  /// <summary>
  /// Letter grade representing the review.  A-F.
  /// </summary>
  public string LetterGrade { get; set; }
}
All right, now that we've got an object let's populate the data. I'm pulling the reviews Yahoo! Movies.
public partial class MainWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();

    // Create some reviews.
    var reviews = new List<Review>
    {
      new Review()
      {
        Critic = "Wesley Morris",
        LetterGrade = "B",
        ReviewSnippet = "For better and worse, it weighs nothing, " +
        "which is not the same as saying it means nothing."
      },

      new Review()
      {
        Critic = "Roger Ebert",
        LetterGrade = "A-",
        ReviewSnippet = "Like the hero of that film, the viewer " +
        "of Inception is adrift in time and experience."
      },

      new Review()
      {
        Critic = "Michael Phillips",
        LetterGrade = "B",
        ReviewSnippet = "Nolan conjures up a fever dream."
      }
    };

    // Set the ItemsSource of the TabControl
    // to the collection of reviews.
    _myTabControl.ItemsSource = reviews;
  }
}
All I did here was copy and paste Yahoo's review data into our new object. I then set the ItemsSource of the TabControl to the collection of reviews. The TabControl was added to my Window using XAML and the name was set to _myTabControl. If we compile and run it now, we won't get anything very helpful.
TabControl with no templates
In order to display our data in a meaningful way, we're going to have to specify two templates. One for the header (ItemTemplate) and one for the tab contents (ContentTemplate).
<Window x:Class="TabControlBinding.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MainWindow"
       Height="350"
       Width="525">
  <Grid>
    <TabControl x:Name="_myTabControl"
               Margin="10">

      <!-- Header -->
      <TabControl.ItemTemplate>
        <DataTemplate>
          <!-- Critic Name -->
          <TextBlock Text="{Binding Critic}" />
        </DataTemplate>
      </TabControl.ItemTemplate>

      <!-- Content -->
      <TabControl.ContentTemplate>
        <DataTemplate>
          <Grid Margin="5">
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="Auto" />
              <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
              <RowDefinition Height="Auto" />
              <RowDefinition Height="5" />
              <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

            <!-- Grade -->
            <TextBlock Text="Grade: "
                      TextAlignment="Right" />
            <TextBlock Text="{Binding LetterGrade}"
                      Grid.Column="1" />

            <!-- Review Snippet -->
            <TextBlock Text="Review: "
                      TextAlignment="Right"
                      Grid.Row="2" />
            <TextBlock Text="{Binding ReviewSnippet}"
                      TextWrapping="Wrap"
                      Grid.Row="2"
                      Grid.Column="1" />

          </Grid>
        </DataTemplate>
      </TabControl.ContentTemplate>

    </TabControl>
  </Grid>
</Window>
Each tab's header now contains the name of the critic who provided the review. The contents of each tab contain the letter grade and the snippet. When we run this code, we now get something that works a little better.
TabControl with templates
That wraps up this tutorial. You now know how to quickly and easily populate a TabControl from a collection and customize its look and feel. If you have any questions or comments, feel free to leave them below.

Comments

Popular posts from this blog

FlexBox (combobox+json +Paging)

FlexBox Visit the FlexBox Home Page FlexBox  is a jQuery plugin that is intended to be a very flexible replacement for html textboxes and dropdowns, optionally using ajax to retrieve and bind JSON data. It can be used as a: ComboBox, with optional per-result html templates Suggest box, like Google's search Data-driven type-ahead input box It supports: Auto-completion using local (JSON) or remote (JSON via ajax) data Skinning via css Flexible paging Configurable client-side caching Much more... (see Configuration Options in the documentation) Screenshotflex More demos and code examples

ASP .NET - XML Files

An XML File Here is an XML file named "countries.xml": <?xml version="1.0" encoding="ISO-8859-1"?> <countries> <country>   <text>Norway</text>   <value>N</value> </country> <country>   <text>Sweden</text>   <value>S</value> </country> <country>   <text>France</text>   <value>F</value> </country> <country>   <text>Italy</text>   <value>I</value> </country> </countries> Bind a DataSet to a List Control First, import the "System.Data" namespace. We need this namespace to work with DataSet objects. Include the following directive at the top of an .aspx page: <%@ Import Namespace="System.Data" %> Next, create a DataSet for the XML file and load the XML file into the DataSet when the page is first loaded: <script runat="server"> sub Page_Load if Not Page.IsPos...

SQL JOINS &UNION

SQL JOIN The JOIN keyword is used in an SQL statement to query data from two or more tables, based on a relationship between certain columns in these tables. Tables in a database are often related to each other with keys. A primary key is a column (or a combination of columns) with a unique value for each row. Each primary key value must be unique within the table. The purpose is to bind data together, across tables, without repeating all of the data in every table. Look at the "Persons" table: P_Id LastName FirstName Address City 1 Hansen Ola Timoteivn 10 Sandnes 2 Svendson Tove Borgvn 23 Sandnes 3 Pettersen Kari Storgt 20 Stavanger Note that the "P_Id" column is the primary key in the "Persons" table. This means that  no  two rows can have the same P_Id. The P_Id distinguishes two persons even if they have the same name. Next, we have the "Orders" table: O_Id OrderNo P_Id 1 77895 3 2 44678 3 3 22456 1 4 24562 1 5 34764 15 Note that the "O_...