Silverlight 4 introduces some further databinding functionality including:
FallbackValue
If there is a problem with performing the binding, for example an incorrect path to a property value, the fallback value will be used in it's place. This allows some meaningful display, rather that the default behaviour of showing nothing.
TargetNullValue
Allows a value to be used if the bound property is null.
StringFormat
Allows formatting of the bound value using standard formatting expressions.
Example
The following is the output of the XAML below:
<Grid x:Name="LayoutRoot" Background="WhiteSmoke" >
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock TextWrapping="Wrap">Invalid binding path with FallbackValue set</TextBlock>
<TextBlock Text="{Binding Path=badPath, FallbackValue='this is a fallback value'}" Grid.Column="1"></TextBlock>
<TextBlock TextWrapping="Wrap" Grid.Row="1">Invalid binding path withOUT FallbackValue set</TextBlock>
<TextBlock Text="{Binding Path=badPath}" Grid.Row="1" Grid.Column="1"></TextBlock>
<TextBlock TextWrapping="Wrap" Grid.Row="2">Bound property = null with TargetNullValue set</TextBlock>
<TextBlock Text="{Binding Path=AnIntProperty, TargetNullValue='The int is null'}" Grid.Column="1" Grid.Row="2"></TextBlock>
<TextBlock TextWrapping="Wrap" Grid.Row="3">Bound property = null withOUT TargetNullValue set</TextBlock>
<TextBlock Text="{Binding Path=AnIntProperty}" Grid.Column="1" Grid.Row="3"></TextBlock>
<TextBlock TextWrapping="Wrap" Grid.Row="4">Bound property with StringFormat</TextBlock>
<TextBlock Text="{Binding Path=AnotherIntProperty, StringFormat='Age is {0} years old.'}" Grid.Column="1" Grid.Row="4"></TextBlock>
<TextBlock TextWrapping="Wrap" Grid.Row="5">Bound property withOUT StringFormat</TextBlock>
<TextBlock Text="{Binding Path=AnotherIntProperty}" Grid.Column="1" Grid.Row="5"></TextBlock>
</Grid>
The DataContext is set to an instance of the following class:
public class TestData : DependencyObject
{
public int? AnIntProperty
{
get { return (int?)GetValue(AnIntPropertyProperty); }
set { SetValue(AnIntPropertyProperty, value); }
}
// Using a DependencyProperty as the backing store for AnIntProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty AnIntPropertyProperty =
DependencyProperty.Register("AnIntProperty", typeof(int?), typeof(TestData),
new PropertyMetadata(0));
public int AnotherIntProperty
{
get { return (int)GetValue(AnotherIntPropertyProperty); }
set { SetValue(AnotherIntPropertyProperty, value); }
}
// Using a DependencyProperty as the backing store for AnotherIntProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty AnotherIntPropertyProperty =
DependencyProperty.Register("AnotherIntProperty", typeof(int), typeof(TestData), new PropertyMetadata(0));
public TestData()
{
AnIntProperty = null;
AnotherIntProperty = 44;
}
}
SHARE: