WPF Binding - Default value for empty string
DataTrigger
is the way i do it like this:
<TextBox> <TextBox.Style> <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ReadOnlyTextBox}"> <Setter Property="Text" Value="{Binding Name}"/> <Style.Triggers> <DataTrigger Binding="{Binding Path=Name.Length, FallbackValue=0, TargetNullValue=0}" Value="0"> <Setter Property="Text" Value="{x:Static local:ApplicationLabels.NoValueMessage}"/> </DataTrigger> </Style.Triggers> </Style> </TextBox.Style></TextBox>
I was under the impression that FallbackValue provides a value when the binding fails and TargetNullValue provides a value when the bound value is null.
To do what you want you will either need a converter (possibly with a parameter) to convert an empty string to a target value, or put the logic in your view model.
I would probably go with a converter something like this (not tested).
public class EmptyStringConverter : MarkupExtension, IValueConverter{ public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return string.IsNullOrEmpty(value as string) ? parameter : value; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } public override object ProvideValue(IServiceProvider serviceProvider) { return this; }}
You should create a converter for this, which implements IValueConverter
public class StringEmptyConverter : IValueConverter {public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return string.IsNullOrEmpty((string)value) ? parameter : value; }public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotSupportedException(); }}
Then in xaml you'd just provide the converter to the binding, (xxx
just represents your Window
/ UserControl
/ Style
... where the binding is)
<xxx.Resources><local:StringEmptyConverter x:Key="StringEmptyConverter" /></xxx.Resources><TextBlock Text="{Binding Name, Converter={StaticResource StringEmptyConverter}, ConverterParameter='Placeholder Text'}" />