webentwicklung-frage-antwort-db.com.de

WPF-Bindung - Standardwert für leere Zeichenfolge

Gibt es eine Standardmethode zum Festlegen eines Standard- oder Fallback-Werts für eine WPF-Bindung, wenn die gebundene Zeichenfolge leer ist?

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

Die FallbackValue scheint nur dann zu greifen, wenn Name null ist, nicht aber wenn String.Empty eingestellt ist.

31
kroimon

Ich hatte den Eindruck, dass FallbackValue einen Wert liefert, wenn die Bindung fehlschlägt, und TargetNullValue einen Wert liefert, wenn der gebundene Wert null ist.

Um das zu tun, was Sie möchten, benötigen Sie entweder einen Konverter (möglicherweise mit einem Parameter), um eine leere Zeichenfolge in einen Zielwert zu konvertieren, oder Sie fügen die Logik in Ihr Ansichtsmodell ein.

Ich würde wahrscheinlich mit einem Konverter sowas gehen (nicht getestet).

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;
    }
}
30
Phil

DataTrigger ist wie ich es mache:

<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>
61
iltzortz

Sie sollten dafür einen Konverter erstellen, der IValueConverter implementiert.

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();
    }

}

Dann würden Sie in xaml nur den Konverter für die Bindung bereitstellen (xxx steht nur für Ihre Window/UserControl/Style ... wo sich die Bindung befindet.)

<xxx.Resources>
<local:StringEmptyConverter x:Key="StringEmptyConverter" />
</xxx.Resources>
<TextBlock Text="{Binding Name, Converter={StaticResource StringEmptyConverter}, ConverterParameter='Placeholder Text'}" />
6
Viv

Sie können einen Konverter verwenden und die entsprechende Validierung darauf durchführen.

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

und in Ihrem Konverter

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!string.IsNullOrEmpty(value.ToString()))
        { /*do something and return your new value*/ }
0
Santux