WPF Binding - valeur par défaut pour chaîne vide

Existe-t-il un moyen standard de définir une valeur par défaut ou une valeur de repli pour une liaison WPF si la chaîne liée est vide?

<TextBlock Text="{Binding Name, FallbackValue='Unnamed'" />

FallbackValue ne semble intervenir que lorsque Name est nulle, mais pas quand il est réglé sur String.Empty.

29
demandé sur Askolein 2013-03-22 14:05:48

4 réponses

j'étais sous l'impression que FallbackValue fournit une valeur lorsque la liaison échoue et TargetNullValue fournit une valeur lorsque la valeur limite est nulle.

pour faire ce que vous voulez, vous aurez besoin soit d'un convertisseur (éventuellement avec un paramètre) pour convertir une chaîne vide en valeur cible, soit de mettre la logique dans votre modèle de vue.

j'utiliserais probablement un convertisseur de ce genre (non testé).

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;
    }
}
29
répondu Phil 2013-03-22 10:18:29

DataTrigger est la façon dont je le fais comme ceci:

<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>
57
répondu iltzortz 2013-03-22 10:21:34

Vous devez créer un convertisseur pour ce qui implémente 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();
    }

}

puis dans xaml vous fourniriez juste le convertisseur à la reliure, (xxx représente Window/UserControl/Style ... où la reliure est)

<xxx.Resources>
<local:StringEmptyConverter x:Key="StringEmptyConverter" />
</xxx.Resources>
<TextBlock Text="{Binding Name, Converter={StaticResource StringEmptyConverter}, ConverterParameter='Placeholder Text'}" />
6
répondu Viv 2013-03-22 11:32:24

Vous pouvez utiliser un convertisseur et correspondant de validation.

Binding="{Binding Path=Name, Converter={StaticResource nameToOtherNameConverter}}"
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!string.IsNullOrEmpty(value.ToString()))
        { /*do something and return your new value*/ }
0
répondu Santux 2013-03-22 10:15:19