23
2012
WPF Tutorial Part-9
WPF Tutorial:
Data Templates
Introduction
Data Template are a similar concept as Control Templates. They give you a very flexible and powerful solution to replace the visual appearance of a data item in a control like ListBox, ComboBox or ListView. In my opinion this is one of the key success factory of WPF.
If you don’t specify a data template, WPF takes the default template that is just a TextBlock. If you bind complex objects to the control, it just calls ToString() on it. Within a DataTemplate, the DataContext is set the data object. So you can easily bind against the data context to display various members of your data object
DataTemplates in Action: Building a simple PropertyGrid
Whereas it was really hard to display complex data in a ListBox with WinForms, its super easy with WPF. The following example shows a ListBox with a list of DependencyPropertyInfo instances bound to it.
Without a DataTemplate you just see the result of calling ToString() on the object. With the data template we see the name of the property and a TextBox that even allows us to edit the value.
<!– Without DataTemplate –>
<ListBox ItemsSource=”{Binding}” />
<!– With DataTemplate –>
<ListBox ItemsSource=”{Binding}” BorderBrush=”Transparent”
Grid.IsSharedSizeScope=”True”
HorizontalContentAlignment=”Stretch”>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin=”4″>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=”Auto” SharedSizeGroup=”Key” />
<ColumnDefinition Width=”*” />
</Grid.ColumnDefinitions>
<TextBlock Text=”{Binding Name}” FontWeight=”Bold”
<TextBox Grid.Column=”1″ Text=”{Binding Value }” />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
How to use a DataTemplateSelector to switch the Template depending on the data
Our property grid looks nice so far, but it would be much more usable if we could switch the editor depending on the type of the property.
The simplest way to do this is to use a DataTemplateSelector. The DataTemplateSelector has a single method to override: SelectTemplate(object item, DependencyObject container). In this method we decide on the provided item which DataTemplate to choose.
The following exmple shows an DataTemplateSelector that decides between tree data templates:
public class PropertyDataTemplateSelector : DataTemplateSelector
{
public DataTemplate DefaultnDataTemplate { get; set; }
public DataTemplate BooleanDataTemplate { get; set; }
public DataTemplate EnumDataTemplate { get; set; }
public override DataTemplate SelectTemplate(object item,
DependencyObject container)
{
DependencyPropertyInfo dpi = item as DependencyPropertyInfo;
if (dpi.PropertyType == typeof(bool))
{
return BooleanDataTemplate;
}
if (dpi.PropertyType.IsEnum)
{
return EnumDataTemplate;
}
return DefaultnDataTemplate;
}
}
<Window x:Class=”DataTemplates.Window1″
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:l=”clr-namespace:DataTemplates”
xmlns:sys=”clr-namespace:System;assembly=mscorlib”>
<Window.Resources>
<!– Default DataTemplate –>
<DataTemplate x:Key=”DefaultDataTemplate”>
…
</DataTemplate>
<!– DataTemplate for Booleans –>
<DataTemplate x:Key=”BooleanDataTemplate”>
</DataTemplate>
<!– DataTemplate for Enums –>
<DataTemplate x:Key=”EnumDataTemplate”>
…
</DataTemplate>
<!– DataTemplate Selector –>
<l:PropertyDataTemplateSelector x:Key=”templateSelector”
DefaultnDataTemplate=”{StaticResource DefaultDataTemplate}”
BooleanDataTemplate=”{StaticResource BooleanDataTemplate}”
EnumDataTemplate=”{StaticResource EnumDataTemplate}”/>
</Window.Resources>
<Grid>
<ListBox ItemsSource=”{Binding}” Grid.IsSharedSizeScope=”True”
HorizontalContentAlignment=”Stretch”
ItemTemplateSelector=”{StaticResource templateSelector}”/>
</Grid>
</Windows>
Images in WPF
How to create a Thumbnail of an Image
private ImageSource GetThumbnail( string fileName )
{
byte[] buffer = File.ReadAllBytes(fileName);
MemoryStream memoryStream = new MemoryStream(buffer);
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.DecodePixelWidth = 80;
bitmap.DecodePixelHeight = 60;
bitmap.StreamSource = memoryStream;
bitmap.EndInit();
bitmap.Freeze();
return bitmap;
}
Related Posts
Leave a comment
Tutorials & Interview Questions
E-Books of the month
Recent Comments
- uma on Tally Tutorial Part-1
- Sudheer.Choragudi on IOS Commands
- Sudhakar Singajogi on QTP Tutorial for Beginners Part-2
- webdagger on OSI LAYERS
- kaladhar on OSI LAYERS
- sreekanth on SAP Tutorial Part-5
Who's Online
- 0 Members.
- 2 Guests.
An article by webdagger










A limited time offer only for one month.The Books are Guide to HTML, JavaScript and PHP For Scientists and Engineers & Sams Teach Yourself is a Book in which you can learn the c++ within 24 hours...
