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.
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.
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.
Source Files:
Comments
Post a Comment