Most applications need a settings page to allow a user to configure how they wish to use your application. In this tutorial we’ll start to look at making the Translation Direction configurable. We’ll shortly be adding in a Settings page, but there’s some groundwork required before we begin.
By the end of this tutorial the Translation Direction Attribute should have a custom Display Attribute associated to it, allowing for the associated display string to be displayed on the view via a Value Converter, which will look up the display text for a given enum value.
Start by creating an Attributes Folder in the MorseCoder.PCL Project and create a new class called DisplayAttribute.
public class DisplayAttribute : Attribute
public string DisplayString
public DisplayAttribute(string displayString)
DisplayString = displayString;
What does this do?
- Gives our Attribute a constructor to allow us to pass in values to it in order to define properties.
- Gives our Attribute a property which we can retrieve information from. Note the public ‘getter’ and private ‘ setter’.
- Assigns the property a value from the constructor.
Let’s modify our TranslationDirection enum to include the new Display Attribute, allowing us to define the text associated with the currently selected TranslationDirection.
Let’s decorate our enum with our new attribute. By convention, we don’t need to provide the Attribute part of the class name when using the attribute.
Note the use of the constructor we just created.
public enum TranslationDirection
[Display("Morse to Alphabet")]
[Display("Alphabet to Morse")]
We can now create a converter to present a display string to the view based on the TranslationDirection being bound against, very similar to the TranslationDirectionToMorseInputVisibilityConverter class we created earlier.
Create a TranslationDirectionToDisplayStringConverter class and inherit from IValueConverter. As before we’ll assert correct type is being used, then we can retrieve our new DisplayAttribute from our TranslationDirection object.
public object Convert(object value, Type targetType, object parameter, string language)
if (value is TranslationDirection)
var type = value.GetType();
var member = type.GetMember(value.ToString());
var attributes = member.First().GetCustomAttributes(typeof(DisplayAttribute), false);
return new InvalidCastException("Input value not of type TranslationDirection");
What’s this doing?
- Retrieving an array of MemberInfo objects where the Member name matches our enumeration value;
- Retrieving the Attributes associated with our enumeration value;
- Returning the first attribute in the array (would probably be more careful using this in a real application!).
Where are we?
- We created a custom Display Attribute;
- We decorated the Translation Direction enumeration with our new attribute;
- We created a converter to convert between the enumeration value and the display string.
We’ll look at:
- Creating an Settings ViewModel and View;
- methods of serialising POCOs to Application Settings;
- MVVM Light Messaging.