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

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...

Net FrameWork (Basic Concepts)

Net FrameWork (Basic Concepts) See more presentations by aSGuest51943  |  Upload your own PowerPoint presentations .Net Framework (Basic Concepts) : .Net Framework (Basic Concepts) 1 Amrita Academy For Career Excellence Overview of the .NET Framework : Overview of the .NET Framework Software development environment which helps developers to develop applications quickly and gives optimum, efficient, scalable, performance oriented applications in different languages like Visual Basic .NET, C#, ASP.NET, and Jscript .NET etc... 2 Amrita Academy For Career Excellence Slide 3: Services NET Framework provides the following services: Tools for developing software applications , run-time environments for software application to execute, server infrastructure, value added intelligent software which helps developers to do less coding and work efficiently. The .Net Framework will enable developers to develop applications for various devices and platforms like window...

Crystal and Reporting Services Interview Questions - Part 2

Introduction   This FAQ will give you a quick start for two report giant's crystal and reporting services. We have two IIS application 'Reports' and 'Reportserver' what do they do ?   When you install reporting services there are two virtual directories created as shown in the figure below. Figure : - IIS Applications for reports The 'Reports' virtual directory is like an admin. If you browse to http://yourpcname/reports/home.aspx   page you can view, edit properties and display reports. We have numbered the below figure. 1 à We can browse reports and see the output of reports. 2 à We can upload a RDL file directly in the report's database. 3 à Using the report builder link we build new reports. 4 à Using the properties we can do role assignment. 5 à Using subscription link we can add new outputs (FTP, Folder etc) to subscribe to the reports. 6 à Site settings help us to decide how many numbers of snapshots we want in the history, report time out...