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