WPF Binding - Default value for empty string WPF Binding - Default value for empty string wpf wpf

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'}" />