WPF Binding - Default value for empty string

后端 未结 4 545
走了就别回头了
走了就别回头了 2020-11-28 11:19

Is there a standard way to set a default or fallback value for a WPF binding if the bound string is empty?



        
相关标签:
4条回答
  • 2020-11-28 11:25

    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;
        }
    }
    
    0 讨论(0)
  • 2020-11-28 11:30

    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>
    
    0 讨论(0)
  • 2020-11-28 11:31

    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'}" />
    
    0 讨论(0)
  • 2020-11-28 11:46

    You could use a converter and do the respective validation on it.

    Binding="{Binding Path=Name, Converter={StaticResource nameToOtherNameConverter}}"
    

    and in your converter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (!string.IsNullOrEmpty(value.ToString()))
            { /*do something and return your new value*/ }
    
    0 讨论(0)
提交回复
热议问题