SIGN UP MEMBER LOGIN:    
ARTICLE

C# and XAML within a Silverlight 2 context - Data conversion: Part VII

Posted by Bechir Bejaoui Articles | Learn .NET December 29, 2008
In this article I will show how to implement a customized converter as a part of the article how does XAML interact within C# code.
Reader Level:
Download Files:
 

In a previous article, how does C# code behind interact with an XAML interface within a Silverlight 2 context? - Data Validation: Part VI we demonstrate how to implement validation logic within a Silverlight 2 application and XAML UI and how a binding engine provides interaction between the two sides, namely the source object and the XAML UI side so that the final user will be notified when invalid entries are used. In this article I will answer the fifth question posed in the article how does C# code behind interact with an XAML interface within a Silverlight 2 context? - Introduction: Part I, which is: what if there is a need to display data in format that differs to the original one?

The solution is brought through the present article. Consider this class Person representation:

public class Person : INotifyPropertyChanged

    {

        public Person() { }

        private string _FirstName;

        public string FirstName{

            get { return _FirstName; }

            set

            {

              

                _FirstName = value;

                if (PropertyChanged != null){

                    PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));

                }

 

            }

        }

        private string _LastName;

        public string LastName

        {

            get { return _LastName; }

            set{

                _LastName = value;

                if (PropertyChanged != null){

                    PropertyChanged(this, new PropertyChangedEventArgs("LastName"));

                }

 

            }

        }

        private DateTime _BirthDate;

        public DateTime BirthDate

        {

            get { return _BirthDate; }

            set{

                _BirthDate = value;

                if (PropertyChanged != null)

                {

                    PropertyChanged(this, new PropertyChangedEventArgs("Age"));

                }

 

            }

        }

        private string _Gender;

        public string Gender{

            get { return _Gender; }

            set{

                _Gender = value;

                if (PropertyChanged != null){

                    PropertyChanged(this, new PropertyChangedEventArgs("Gender"));

                }

 

            }

        }

        public override string ToString(){
      
     return string.Format("First name: {0},last name: {1},age: {2},gender: {3}",
                                                                                        FirstName,
                                                                                        LastName,
                                                                                         BirthDate,
                                                                                         Gender);

        }

        #region INotifyPropertyChanged Members

 

        public event PropertyChangedEventHandler PropertyChanged;

 

        #endregion

    }

Then consider this simple XAML presentation

<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  xmlns:basics="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"  x:Class="Silverlight.Page"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Width="550" Height="50">

    <StackPanel x:Name="LayoutRoot"

                Margin="10"

                Orientation="Vertical"

                Background="White"

                >

        <TextBlock x:Name="txtPerson"

                   FontSize="12"

                   FontWeight="Bold"

                   Foreground="Black"

        Text="First name: Bejaoui,last name: Bechir ,Birth day: 11/04/78 ,gender: Male"

                   />

    </StackPanel>

</UserControl>

As we remarked the text dependency property of the txtPerson TextBlock object is already set. But what if we want to get a Person object issued from the above string that we will use in our C #program. Suppose that we have implemented a logic that stocks objects type of person within a given storage, a data base, an Xml file or so. Using a converter is the solution in that case, but the problem is that there is not standard converter to leverage our specific conversion as the Person type has been developed by ourselves, thus the System.Windows.Data namespace provides us an interface that helps to build such customized converter and this is an IValueConverter interface presentation:

public interface IValueConverter

    {

        object Convert(object value,

                       Type targetType,

                       object parameter,

                       System.Globalization.CultureInfo culture);

       

         object ConvertBack(object value,

                            Type targetType,

                            object parameter,

                            System.Globalization.CultureInfo culture);

    }

As we can remark, the both methods return an entity type of object, and they have both the same arguments set:

Type  Function
object value The initial object going to be converted
Type targetType It represents the type to which the initial type will be converted
object parameter It is used when the initial object has a parameter or the converted one has a parameter or event when there is a situation when some optional values are required for adjustement puposes
CultureInfo culture It is used when culture is going to be changed

In our situation, we need to convert an object type of Person to a certain string format and also convert this string back to the person type, so the converter will be developed as under:

public class PersonConverter : IValueConverter

    {

       

        #region IValueConverter Members

        /// <summary>

        /// This method converts a type od person object to string

        /// </summary>

        /// <param name="value">object: The initial object going to be converted</param>

        /// <param name="targetType">type: It represents the type to which the

        /// initial type will be converted</param>

        /// <param name="parameter">object: It is used when the initial object

        /// has a parameter or the converted one has a parameter or event when

        /// there is a situation when some optional values are required for

        /// adjustement puposes

        /// </param>

        /// <param name="culture">culture info: It is used when culture

        ///is going to be changed

        /// from the initial object to the final object

        /// </param>

        /// <returns>object: The returned value</returns>

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

        {

            Person person = (Person)value;

            string personToString = person.ToString();

            return personToString;

        }

        /// <summary>

        /// This method converts a type od person object to string

        /// </summary>

        /// <param name="value">object: The initial object going to be converted</param>

        /// <param name="targetType">type: It represents the type to which the

        /// initial type will be converted</param>

        /// <param name="parameter">object: It is used when the initial object

        /// has a parameter or the converted one has a parameter or event when

        /// there is a situation when some optional values are required for

        /// adjustement puposes

        /// </param>

        /// <param name="culture">culture info: It is used when culture is going to be changed

        /// from the initial object to the final object

        /// </param>

        /// <returns>object: The returned value</returns>

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

        {

            string personFromString = (string)value;

            char[] splitter = new char[] { ':', ',' };

            string[] DecomposedString = personFromString.Split(splitter);

            Person person = new Person();

            try

            {

                person.FirstName = DecomposedString[1].ToString();

                person.LastName = DecomposedString[3].ToString();

                person.BirthDate = System.Convert.ToDateTime(DecomposedString[5]);

                person.Gender = DecomposedString[7].ToString();

                return person;

            }

            catch (Exception caught) { return null; }

        }

 

        #endregion

    }

Now, we try to get the txtPerson TextBlock object in the C# code behind and get its text in order to convert it to a type of person using our customized converter as under:

TextBlock PersonDisplayer;

 public Page()

{

      InitializeComponent();

      PersonDisplayer = this.FindName("txtPerson") as TextBlock;

      PersonConverter converter = new PersonConverter();

      Person me = converter.ConvertBack(PersonDisplayer.Text, 
                    typeof(Person), 
          
          null
                     null) as Person;

            MessageBox.Show(me.FirstName);

            MessageBox.Show(me.LastName);

            MessageBox.Show(me.BirthDate.ToString("D"));

            MessageBox.Show(me.Gender);         

}

As we can remark, the string is really converted to a Person object


      
Figure 1

That's it. 

Good Dotneting!!!

Login to add your contents and source code to this article
share this article :
post comment
 
Become a Sponsor
PREMIUM SPONSORS
  • Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
    ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications. Visit DynamicPDF here
6 Months Free & No Setup Fees ASP.NET Hosting!
Become a Sponsor