You can specify a binding for a Silverlight control to a data property of a Xomega data object directly in the XAML. The data object serves as a view model for your form. When the object is set as the DataContext for the view, the control will be automatically bound to the corresponding data property, which will allow Xomega Framework to keep the content of the control (such as the value or a list of values) as well as the control's state (e.g. visibility, editability, etc.) in sync with that of the data property.
In order to specify a property binding on a control, you can perform the following steps.
- Declare a namespace xom on your page in the XAML that maps to the Xomega Framework namespace, e.g. xmlns:xom="clr-namespace:Xomega.Framework;assembly=Xomega.Framework"
- Add an attribute xom:Property.Name to the XML element of the control and set its value to the name of the corresponding data property in the data object. You cannot bind the attribute value to a static string constant since the x:Static construct is not supported in Silverlight.
- If you want to bind to a data property that is defined on a child object of the current context object, then you can set the xom:Property.ChildObject attribute to indicate a child object's name or a dot-delimited path to it.
- Optionally set the xom:Property.Label attribute to indicate the label element associated with this control. This will allow Xomega Framework to show or hide the label along with the control and possibly highlight the label for required properties.
- Make sure that in your code behind you set the DataContext of the encapsulating panel to your data object, e.g. pnlMain.DataContext = obj;
The following XAML snippet demonstrates these steps. A
TextBlock element is used as a label for the field, as the
Label WPF element is not supported in Silverlight. Also, the font weight is bound to the
Required attribute of the data property to highlight the labels for required fields in bold. This is due to a Silverlight limitation for style triggers that prevents from doing it in a style instead.
Code:
<TextBlock Grid.Row="5" Grid.Column="2" Name="lblFirstName" Text="First Name:"
FontWeight="{Binding Path=(xom:Property.Required), RelativeSource={RelativeSource Self},
Converter={StaticResource Required2FontWeight}}"/>
<TextBox Grid.Row="5" Grid.Column="3" Name="ctlFirstName"
xom:Property.Name="FirstName"
xom:Property.ChildObject="Contact"
xom:Property.Label="{Binding ElementName=lblFirstName}"/>