How to use DesignData to populate controls with design time data in Silverlight and WPF

In this post I’ll be showing how you can use DesignData to populate controls when you’re designing Silverlight or WPF applications in Expression Blend or Visual Studio.

The image below shows a user control in Expression Blend which allows users take part in a poll to find out what their favorite colors of the rainbow are.

Expression Blend Without Design Time Data

As you can see it’s difficult if not impossible to imagine what we are actually designing here.

The user control doesn’t look any better in Visual Studio 2010.

Visual Studio Without Design Time Data

Creating the ViewModel for the Object Data Source

The code for the ViewModel we want to create sample data for is shown below.

public class ViewModel : INotifyPropertyChanged
{
    private string _name;

    public event PropertyChangedEventHandler PropertyChanged;

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }

    public ObservableCollection<RainbowColor> RainbowColors { get; set; }

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this,
                new PropertyChangedEventArgs(propertyName));
        }
    }
}

public class RainbowColor
{
    public string Description { get; set; }
    public string Color { get; set; }
}

The bit where Expression Blend flexes it muscles

If you’re using Expression Blend the good news is that creating sample data can be done in a couple of clicks.

In the Data tab click on the ‘Create data source’ button to see the following window

Expression Blend Without Design Time Data

Next select ViewModel as the object to create the data source for

Expression Blend Without Design Time Data

This will create a XAML file populated with sample data, which has been modified to be the colors of the rainbow.

<DeginTimeDataInSilverlightApplications:ViewModel 
    xmlns:DeginTimeDataInSilverlightApplications="clr-namespace:DeginTimeDataInSilverlightApplications" 
    Name="Roy G Biv">
	<DeginTimeDataInSilverlightApplications:ViewModel.RainbowColors>
        <DeginTimeDataInSilverlightApplications:RainbowColor Color="#FFFF0000" Description="Red"/>
        <DeginTimeDataInSilverlightApplications:RainbowColor Color="#FFFFA500" Description="Orange"/>
        <DeginTimeDataInSilverlightApplications:RainbowColor Color="#FFFFFF00" Description="Yellow"/>
        <DeginTimeDataInSilverlightApplications:RainbowColor Color="#FF008000" Description="Green"/>
        <DeginTimeDataInSilverlightApplications:RainbowColor Color="#FF0000FF" Description="Blue"/>
        <DeginTimeDataInSilverlightApplications:RainbowColor Color="#FF4B0082" Description="Indigo"/>
        <DeginTimeDataInSilverlightApplications:RainbowColor Color="#FFEE82EE" Description="Violet"/>
    </DeginTimeDataInSilverlightApplications:ViewModel.RainbowColors>
</DeginTimeDataInSilverlightApplications:ViewModel>

Creating DesignData in Visual Studio

In Visual Studio you have to create the XAML file manually and change the build action for it to DesignData as shown below.

Visual Studio BuildAction For DesignTimeData

My recommendation is to store the XAML files containing sample data in a SampleData sub folder (which Expression Blend does by default).

Setting the DataContext to use DesignData in XAML

In order to bind the sample data to the user control during design time we need to add a few more lines in the opening tag.

The lines that use DesignData to bind data in the designer are highlighted in the XAML for the user control below.

<UserControl
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	x:Class="DeginTimeDataInSilverlightApplications.MainPage"
	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
	mc:Ignorable="d"
	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"        
	d:DataContext="{d:DesignData Source=./SampleData/ViewModelSampleData.xaml}"	
	d:DesignWidth="600">
    <UserControl.Resources>
        <DataTemplate x:Key="RainbowTemplate">
            <Border Background="{Binding Color}">
                <StackPanel Margin="10" Orientation="Horizontal">
                    <CheckBox/>
                    <TextBlock Text="{Binding Description}" 
                               Foreground="Black" 
                               FontWeight="Bold" />
                </StackPanel>
            </Border>
        </DataTemplate>
        <Style x:Key="ListBoxStretchStyle" TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        </Style>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel>
            <TextBlock Text="Choose your favorite colors!" 
                       Margin="5" 
                       TextAlignment="Center" 
FontWeight="Bold" />
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="Name:" Margin="10" VerticalAlignment="Center" />
                <TextBox Text="{Binding Name}"  Grid.Column="1"  VerticalAlignment="Center"/>
                <Button Content="Submit" Grid.Column="2" Margin="10"  Width="100" Height="50"/>
            </Grid>
			<ListBox ItemsSource="{Binding RainbowColors}" 
					 ItemContainerStyle="{StaticResource ListBoxStretchStyle}" 
					 ItemTemplate="{StaticResource RainbowTemplate}"/>
        </StackPanel>
    </Grid>
</UserControl>

Pay attention to the line

mc:Ignorable="d"

If you don’t add this you will see the following error when you try to compile the solution

XAML Namespace http://schemas.microsoft.com/expression/blend/2008 is not resolved.

If you’re using Expression Blend the designer will now look like this

Expression Blend With Design Time Data

or like this if you’re using Visual Studio 2010

Visual Studio With Design Time Data

Does it matter if I’m using MVVM or not?

No. Even though I’m using a ViewModel in this example, all that matters is that you can bind your sample data to the data context of the control.

How design time data will save you time designing Silverlight and WPF applications

When it comes to designing applications it’s definitely a lot easier when you can visualize what you’re creating without actually running the solution.

So why should it be any different for Silverlight and WPF?

If you just want to know how you can populate controls during design time the links below show three (of the many) ways you can populate your pages, windows, user controls, grids etc with sample data in Expression Blend or Visual Studio.

Why populating controls with design time data in Silverlight and WPF will improve your productivity

Let’s image for a moment we were given the task of designing a Silverlight application to find out what colors of the rainbow are the most popular.

The SketchFlow prototype below shows what we are aiming for.

Rainbow in Sketchflow

Well this is easy enough isn’t it? The XAML below should do the job.

<UserControl
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	x:Class="DeginTimeDataInSilverlightApplications.MainPage"		
    Width="600">
    <UserControl.Resources>
        <DataTemplate x:Key="RainbowTemplate">
            <Border Background="{Binding Color}">
                <StackPanel Margin="10" Orientation="Horizontal">
                    <CheckBox/>
                    <TextBlock Text="{Binding Description}" 
							   Foreground="Black" 
							   FontWeight="Bold" />
                </StackPanel>
            </Border>
        </DataTemplate>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
		<StackPanel>
			<TextBlock Text="Choose your favorite colors!" 
					   Margin="5" 
					   TextAlignment="Center" 
                       FontWeight="Bold" />
			<Grid>
				<Grid.ColumnDefinitions>
					<ColumnDefinition Width="Auto"/>
					<ColumnDefinition Width="*"/>
					<ColumnDefinition Width="Auto"/>
				</Grid.ColumnDefinitions>
				<TextBlock Text="Name:" 
                           Margin="10" 
                           VerticalAlignment="Center" />
				<TextBox Text="{Binding Name}"  
                         Grid.Column="1"  
                         VerticalAlignment="Center"/>
				<Button Content="Submit" 
                        Grid.Column="2" 
                        Margin="10"  
                        Width="100" 
                        Height="50"/>
			</Grid>
			<ListBox ItemsSource="{Binding RainbowColors}"                      
                     ItemTemplate="{StaticResource RainbowTemplate}"/>
		</StackPanel>
	</Grid>
</UserControl>

Spot any problems, issues or flaws yet?

If we run this application this is what is shown to the user.

Rainbow Without Stretch

As you can see there is a problem with the ListBoxItem not stretching to the width of the grid.

If you had used deign time data this is what you would have seen in Expression Blend.

Showing Rainbow Without Stretch

Still not convinced design time data will help you?

Well in that case have fun implementing a fix, running the application, implementing another fix, running the application again until you’ve resolved the issue or ran out of time.

Jag Reehal’s Final Thought on ‘How design time data will save you time designing Silverlight and WPF applications’

Designing is so much easier when you’re able to see controls populated with sample data because you will be able to find and resolve design issues and problems quicker using design time data.

How to use a DesignInstance to populate controls with design time data in Silverlight and WPF

In this post I’ll be showing how you can use a DesignInstance to populate controls when you’re designing Silverlight or WPF applications in Expression Blend or Visual Studio.

The image below shows a user control in Expression Blend which allows users take part in a poll to find out what their favorite colors of the rainbow are.

Expression Blend Without Design Time Data

As you can see it’s difficult if not impossible to imagine what we are actually designing here.

The user control doesn’t look any better in Visual Studio 2010.

Visual Studio  WithoutDesign Time Data

Creating the ViewModel to bind the data context using DesignInstance

The code below shows the DesignTimeViewModel class to be used as the data context during design time. It inherits from the ViewModel class which will be used when the application is actually running.

public class DesignTimeViewModel : ViewModel
{
    public DesignTimeViewModel()
    {
        Name = "Roy G Biv";
        RainbowColors = new ObservableCollection<RainbowColor>()
                            {                                    
                                new RainbowColor() {Description = "Red", Color =  "#FFFF0000"},
                                new RainbowColor() {Description = "Orange", Color =  "#FFFFA500"},
                                new RainbowColor() {Description = "Yellow", Color =  "#FFFFFF00"},
                                new RainbowColor() {Description = "Green", Color =  "#FF008000"},
                                new RainbowColor() {Description = "Blue", Color =  "#FF0000FF"},
                                new RainbowColor() {Description = "Indigo", Color =  "#FF4B0082"},
                                new RainbowColor() {Description = "Violet", Color =  "#FFEE82EE"}                                    
                            };
    }
}

public class ViewModel : INotifyPropertyChanged
{
    private string _name;

    public event PropertyChangedEventHandler PropertyChanged;

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }

    public ObservableCollection<RainbowColor> RainbowColors { get; set; }

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this,
                new PropertyChangedEventArgs(propertyName));
        }
    }
}

public class RainbowColor
{
    public string Description { get; set; }
    public string Color { get; set; }
}

Setting the DataContext to use DesignInstance in XAML

In order to bind the DesignTimeViewModel to the user control during design time we need to add a few more lines in the opening tag.

The lines that use a DesignInstance to bind data in the designer are highlighted in the XAML for the user control below.

 <UserControl
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	x:Class="DeginTimeDataInSilverlightApplications.MainPage"
	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
	mc:Ignorable="d"
	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"            
	xmlns:local="clr-namespace:DeginTimeDataInSilverlightApplications"
    d:DataContext="{d:DesignInstance Type=local:DesignTimeViewModel,IsDesignTimeCreatable=True}"
    d:DesignWidth="600">
    <UserControl.Resources>
        <DataTemplate x:Key="RainbowTemplate">
            <Border Background="{Binding Color}">
                <StackPanel Margin="10" Orientation="Horizontal">
                    <CheckBox/>
                    <TextBlock Text="{Binding Description}" 
                               Foreground="Black" 
                               FontWeight="Bold" />
                </StackPanel>
            </Border>
        </DataTemplate>
        <Style x:Key="ListBoxStretchStyle" TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        </Style>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel>
            <TextBlock Text="Choose your favorite colors!" 
                       Margin="5" 
                       TextAlignment="Center"
                       FontWeight="Bold" />
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="Name:" Margin="10" VerticalAlignment="Center" />
                <TextBox Text="{Binding Name}"  Grid.Column="1"  VerticalAlignment="Center"/>
                <Button Content="Submit" Grid.Column="2" Margin="10"  Width="100" Height="50"/>
            </Grid>
            <ListBox ItemsSource="{Binding RainbowColors}" 
					 ItemContainerStyle="{StaticResource ListBoxStretchStyle}" 
					 ItemTemplate="{StaticResource RainbowTemplate}"/>
        </StackPanel>
    </Grid>
</UserControl>

Pay attention to the line

mc:Ignorable="d"

If you don’t add this you will see the following error when you try to compile the solution

XAML Namespace http://schemas.microsoft.com/expression/blend/2008 is not resolved.

If you’re using Expression Blend the designer will now look like this

Expression Blend With Design Time Data

or like this if you’re using Visual Studio 2010

Visual Studio With Design Time Data

Does it matter if I’m using MVVM or not?

No. Even though I’m using a ViewModel in this example, all that matters is that you can bind your sample data to the data context of the control.

Page 1 of 512345