Introduction
What this article will show is how to pass DateTime
values into properties in XAML.
Background
Recently, I had the need for an encapsulated, reusable 'About Box' control that I could use throughout a number of Silverlight applications. I then wrote a user control that would serve this purpose. The AboutBox
displays application releases that are grouped by the application version, and a list of changes/updates included in that version. An example of this can be seen below:
Although the use and implementation of the AboutBox
user control is beyond the scope of this article, one of the features of the AboutBox
was to enable the developer to specify a date for a product release item. I made provision for this by creating a DateTime
property called Date
in the VersionInformation
class. However, I encountered a problem when trying to specify a value for this property in the XAML of the page consuming the AboutBox
user control, as follows:
<applesControls:AboutBox Margin="5">
<applesControls:AboutBox.ItemsSource>
<applesClasses:VersionInformation VersionNumber="1.0.0.0" Date="12 January 2009">
<applesClasses:VersionInformation.Changes>
<applesClasses:Change Item="First release." />
</applesClasses:VersionInformation.Changes>
</applesClasses:VersionInformation>
</applesControls:AboutBox.ItemsSource>
</applesControls:AboutBox>
I realized that XAML natively does not know how to convert a string to a DateTime
value, and setting the Date
property as Date="12 January 2009"
would result in an AG_E_UNKNOWN_ERROR
XAML parser error when running the application.
Thankfully, there is a way to resolve this. The answer lies in TypeConverter
.
Using the Code
The sample code has been written as a Visual Studio 2008 SP1 solution that contains three projects:
- 46ApplesAboutBox
This is a Silverlight 3 application that consists of a MainPage.xaml to display the AboutBox
user control.
- 46ApplesAboutBox.Common
A Silverlight 3 Class Library that contains the following class declarations:
VersionInformation
DateTypeConverter
- The
AboutBox
user control
- 46ApplesaboutBox.Web
An ASP.NET web application that hosts the 46ApplesAboutBox Silverlight application.
To run the demo:
- Extract the zip archive (46ApplesAboutBox.zip) containing the solution to disk.
- Make 46ApplesaboutBox.Web the startup project.
- Set 46ApplesAboutBoxTestPage.aspx as the startup page.
Writing a Custom TypeConverter
For us to pass in a DateTime
value as a custom property in XAML, we need to write a TypeConverter
. For the AboutBox project, I created a class called DateTypeConverter
that inherits from and overrides methods in the TypeConverter
class. One of the more interesting methods that were overridden is the ConvertFrom
method.
public override object ConvertFrom(ITypeDescriptorContext context,
CultureInfo culture, object value)
{
if (value.GetType() == typeof(string))
{
try
{ return DateTime.Parse(value.ToString()); }
catch
{ throw new InvalidCastException(); }
}
return base.ConvertFrom(context, culture, value);
}
This method is responsible for converting the specified string
representation of the date to the intended DateTime
value.
One more thing remains. We need to tell the Date
property in our VersionInformation
class that we want to use a custom type converter that will perform the conversion from a string
to a DateTime
. This is accomplished by adding a TypeConverter
attribute to the Date
property, as follows:
[TypeConverter(typeof(DateTypeConverter))]
public DateTime Date
{
get { return (DateTime)GetValue(_dateProperty); }
set { SetValue(_dateProperty, value); }
}
This will now allow us to pass in a "12 January 2009" string into the Date
property, and it will be converted to and treated as a DateTime
value.