Click here to Skip to main content
Click here to Skip to main content

Tagged as

Data Binding Using IValueConverter in Silverlight

, 2 Aug 2011 CPOL
Rate this:
Please Sign up or sign in to vote.
Silverlight with IValueConverter to to Format Data

Introduction

Silverlight is used for creating rich RIA application. if we wish to bind value in XAML, we are using dependencyproperty and dependencyobject.

One more features of Silverlight for data biniding process is IValueConverter.

IValueConverter is used for formatting and binding data to silverlight XAML control.

Background

When we are binding data to controls there will be times when the data needs to be modified.

a value converter is used in that case and you can re-use your source.

In this article we go through creating converter and code for some value converter examples.

Using the Code

Using Value Converter you can convert:

  • Boolean value to Visibility of control
  • Double value to Percentage
  • Double to Opacity of Control
  • Numeric to Color of Control

Example 1: Numeric to Color of Control

In my XAML page, i am binding Employee List to itemssource and i want to give background color of each employee different display.

First I am creating one converter to convert numeric value to color brush.

Class : NumericToColorConverter.cs

public class NumericToColorConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, 
            object parameter, System.Globalization.CultureInfo culture)
        {
            Int32 id = System.Convert.ToInt32(value);
 
            LinearGradientBrush brush = new LinearGradientBrush();
            brush.StartPoint = new Point(0, 1);
            brush.EndPoint = new Point(0, 0);
            brush.GradientStops.Add(new GradientStop() { Color = Colors.White, 
                Offset = 0 });
            brush.GradientStops.Add(new GradientStop()
            {
                Color = Color.FromArgb(
                    200,
                    System.Convert.ToByte((id * 103) % 256),
                    System.Convert.ToByte((id * 157) % 256),
                    System.Convert.ToByte((id * 233) % 256)
                ),
                Offset = 1
            });
 
            return brush;
        }
 
        public object ConvertBack(object value, Type targetType, object parameter, 
            System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
IValueConverter has two methods Convert and ConvertBack to convert passed value.

In Convert method:

  • first field has value which we passsed from data binding in XAML page.
  • second field is parameter passed as ConverterParameter at the time of binding.
  • third field is used when we are working on globalization.
You can convert Numeric values to SolidColorBrush or LinearGradientBrush.

Converting numeric value to color you have to convert value to bytes in (A,R,G,B) format that is Red,Green and Blue value and A parameter is for Opacity.

My XAML Page

first you need to add reference of converter in usercontrol.

     <UserControl x:Class="MyApp:MyTestPage"             
                 xmlns:converters="MyApp.Library.Converters"          
                 mc:Ignorable="d">

Create key in resource/style for use in page.
Collapse

    <UserControl.Resources>
            <converters:NumericToColorConverter x:Key="NumericToColorConverter" />
        </UserControl.Resources>

Bind Data in Control and pass Converter to convert and get back Background Color.

<ItemsControl x:Name="myControl"
        VerticalAlignment="Top"
        ItemsSource="{Binding Employees}">
                <ItemsControl.ItemTemplate>
                             <DataTemplate>
                             <Border BorderThickness="1"
                             CornerRadius="5"
                             VerticalAlignment="Top"
                             BorderBrush="Black"
                             Width="150"
                             Height="50"
                             Margin="0"
                             Background="{Binding EmployeeID, 
                             Converter={StaticResource NumericToColorConverter}}">
                  <TextBlock Text="{Binding EmployeeName}"
                             FontWeight="Bold"
                             Height="25" />
                   </Border>
                </DataTemplate>
         </ItemsControl.ItemTemplate>
   </ItemsControl>

So, this way you can convert value to your formatted value.

Example 2 : Boolean to Visibility Converter

In this example you are going to read about, you have boolean value (true/false) based on that you return Visibility of control (visible/collapsed) from converter.

public class VisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, 
            System.Globalization.CultureInfo culture)
        {
            Boolean result = true;
 
            if (parameter != null) Boolean.TryParse(parameter.ToString(), out result);
 
            if (value != null && value is Boolean)
            {
                if (System.Convert.ToBoolean(value) == result)
                {
                    return System.Windows.Visibility.Visible;
                }
                else
                {
                    return System.Windows.Visibility.Collapsed;
                }
            }
 
            return value;
        }
 
        public object ConvertBack(object value, Type targetType, object parameter, 
            System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
In above code if you are passing true value at binding source and pass to converter, it will return Visibility.Visible and it value is false it will return Visibility.Collapsed.

You can also pass converter parameter to get result based on passed parameter.

Creating resource

<UserControl.Resources>
        <converters:VisibilityConverter x:Key="VisibilityConverter" />
    </UserControl.Resources>

In XAML Binding

I am binding IsImageVisible property to True.
   <Border Background="White"
                    Visibility="{Binding Path=IsImageVisible, 
                    Converter={StaticResource VisibilityConverter}}">
                <Image Stretch="Uniform"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       Source="/MyApp;component/Resources/Default/Images/abc.jpg" />
            </Border>
So, it will return Visibility to Visible.

Now, Using Converter Parameter

In XAML Binding

I am binding IsImageVisible property to True and ConverterParemeter to False.

   <Border Background="White"
                    Visibility="{Binding Path=IsImageVisible, 
             Converter={StaticResource  VisibilityConverter},ConverterParameter=False}">
                <Image Stretch="Uniform"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       Source="/MyApp;component/Resources/Default/Images/abc.jpg" />
            </Border>

Using above code you will get Visibility to Collapsed. You can use mulitple functionality by passing converterparameter to converter.

Summary

In this article you learned how to use a Value Converter class to take data that is in one format and convert it to another format prior to displaying that value in a XAML control.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Hiren Khirsaria
Software Developer (Senior)
India India
has Total 5+ years of Experience in Microsoft.Net Environment. out of that,
 
2 + year of Excperience in .Net Development with C# and SQL Server 2005/2008.
 
3 + years of Experience in WPF/Silverlight.
 
Current area of Development in Mono for Android (Xamarin), Silverlight/ WPF and Windows Phone 7 Application.
 
Follow him on : http://hirenkhirsaria.blogspot.com/

Comments and Discussions

 
GeneralReason for my vote of 5 It's really good for silverlight beg... Pinmembergowthamg27-Nov-11 22:09 
GeneralReason for my vote of 2 ok PinmemberStole98-Aug-11 21:56 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.141223.1 | Last Updated 2 Aug 2011
Article Copyright 2011 by Hiren Khirsaria
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid