Loading
Feb
23
2012

WPF Tutorial Part-9

Loading

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

A Word From Author:

We share articles collected from the web.Any suggestions or issues with the contents please contact us at info@downloadsparade.com.Please read Disclaimer For more Information.

Leave a comment

Tutorials & Interview Questions

PageRank



E-Books of the month

Guide-to-HTML-JavaScript-and-PHP Sams.Teach.Yourself.C.plus.plus.in.24.Hours.5th.Edition.2011 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...

Enter your Email to Grab free E-Books


didn't receive the e book please contact us at info@downloadsparade.com

Recent Comments

Who's Online

  • 0 Members.
  • 2 Guests.

Stats