Thursday, August 30, 2012

Caliburn.Micro: Design time support

WPF and Caliburn.Micro are a powerful combination. You create a viewmodel and related view, name your controls appropriately  and all magic happens automatically. Controls are bound to the View Model’s properties and methods for you. The problem is that it is all happing at run time not at design time. So when you are developing inside Visual Studio or Expression Blend you aren’t able to see how the form will look like with bound data.
Caliburn.Micro supports design-time binding out-of-the-box. How can we configure this?
In the constructor of my ViewModel, I check if we are executing in design time:
public class SampleViewModel : Screen
{
 public SampleViewModel()
 {
  if (Execute.InDesignMode)
         LoadDesignData();
 }
}
In this sample I populate my ViewModel with some sample data at design time.

private void LoadDesignData()
{
 this.Sessions.Add(new ProfilerSessionViewModel() { Id = Guid.NewGuid(), Duration = "30ms", Name = "Session 1", Started = DateTime.Now.AddMilliseconds(-30) });
 this.Sessions.Add(new ProfilerSessionViewModel() { Id = Guid.NewGuid(), Duration = "30ms", Name = "Session 1", Started = DateTime.Now.AddMilliseconds(-30) });
 this.Timings.Add(new TimingViewModel() { Duration = "30ms" });
 /*Removed some lines*/
    this.Queries.Add(new QueryViewModel() { CallStack = "", Duration = "10", NrOfRecordsAffected = 92, Query = "SELECT * FROM Products", QueryType = "ExecuteDataReader", Step = "Executing query", TimeFromStart = "3" });
}

In my view I added the following code:

<Window x:Class="VLM.SOFA.Profiling.Win.UI.ProfilerView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" 
xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"
xmlns:vm="clr-namespace:VLM.SOFA.Profiling.Win.UI"
d:DataContext="{d:DesignInstance Type=vm:SampleViewModel, IsDesignTimeCreatable=True}"
cal:Bind.AtDesignTime="True">
</Window>


I set the Bind.AtDesignTime property of Caliburn.Micro to true, create an ignorable alias “d” and assign an instance of my viewmodel to my design time datacontext.

And now we have nice design time support:

image

3 comments:

Anonymous said...

Nice post. Thanks.

sanju said...

Nice. keep it Up

Bangalore Web Guru said...
This comment has been removed by a blog administrator.