Using a ConverterParameter in a Silverlight 2 Value Converter


In building a Silverlight 2 application with data binding, you often need to convert between data types and many of the data types that you use already have built-in converter.  One type that does have a built-in converter is the DateTime type.  what this means is that when a binding to a date field, like with a SyndicationItem.PublishDate.Date, you don’t have to specify how the value gets converted.  Often that isn’t optimal.  Emil Stoychev wrote a great article on how to write a custom DateTime converter for birthdays, but I wanted to make a more generic DateTime converter class.  To do this, I used the ConverterParameter part of the Data binding syntax:

<TextBlock Text="{Binding PublishDate.Date, Converter={StaticResource DateTimeConverter}, 
ConverterParameter=d}"
/>

In doing this I am passing a ConverterParameter, "d", to the Convert() function as the parameter parameter. This enables me to specify the formatting in the XAML.  In this case the ‘d’ format will make a date like 7/30/2008 – without the time:

using System;
using System.Windows.Data;

namespace Journalist2
{
    /// <summary>
    /// DateTime value converter
    /// </summary>
    public class DateTimeConverter : IValueConverter
    {
        #region IValueConverter Members

        /// <summary>
        /// Convert from a DateTime to a string
        /// </summary>
        /// <param name="value">a DateTime</param>
        /// <param name="targetType">a string type</param>
        /// <param name="parameter">the formatting parameter for DateTime.ToString()</param>
        /// <param name="culture">the culture to use</param>
        /// <returns>a string</returns>
        public object Convert(object value, Type targetType, object parameter, 
            System.Globalization.CultureInfo culture)
        {
            if (value is DateTime)
            {
                var dt = (DateTime) value;

                if (parameter == null)
                {
                    return dt.ToString(culture);
                }
                else
                {
                    return dt.ToString(parameter as string, culture);
                }
            }

            return null;
        }

        public object ConvertBack(object value, Type targetType, object parameter, 
            System.Globalization.CultureInfo culture)
        {
            var strValue = value as string;

            if (strValue != null)
            {
                return DateTime.Parse(strValue, culture);
            }

            return null;
        }

        #endregion
    }
}
Comments (4)

  1. This is something that wasn’t clear to me so I decided to blog about so that I could fully understand

  2. Braulio says:

    The formatting parameter is an excellent idea !! just with one converter you can map to a lot of date formats.

    Just one question, to define bindings is quite good, but I have an static resource class defined on the XAML (to allow designers see some data on Expression), if I try to setup a date in the XAML it gives me an error, something like

    <MyItem

    MyDate="01/01/2009"

    />

    fails, any clue on this?

    Thanks

     Braulio

  3. mscherotter says:

    Braulio,

    You need to define a TypeConverter for MyDate to convert from the string to the DateTime.

    TypeConverter(typeof(DateTimeTypeConverter))]

    public DateTime MyDate {get;set;}

    See http://code.msdn.microsoft.com/DateTimeTypeConverte for example code for the converter.

    Michael

  4. kartik says:

    I want to pass a combobox value to the IValuseConverter as a parameter. How dod i achive this? I am using silverligth 4