2013-03-22 14 views
27

Esiste un modo standard per impostare un valore di default o di fallback per un'associazione WPF se la stringa associata è vuota?Associazione WPF - Valore predefinito per stringa vuota

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

L'FallbackValue sembra solo a calciare in quando Name è nullo, ma non quando è impostato su String.Empty.

+3

c'è una risposta molto semplice a [inserire descrizione collegamento qui] [1] [1] : http://stackoverflow.com/questions/16612622/give-textblock-default-value-if-result-returns-null – FLICKER

+0

c'è una soluzione molto semplice a [Valore predefinito TextBox se i rendimenti di rilegatura null] [1] [1]: http://stackoverflow.com/questions/16612622/give-textblock-default-value-if-result-returns- null – FLICKER

risposta

26

Ho avuto l'impressione che FallbackValue fornisca un valore quando l'associazione non riesce e TargetNullValue fornisce un valore quando il valore associato è null.

Per fare ciò che volete, avrete bisogno di un convertitore (possibilmente con un parametro) per convertire una stringa vuota in un valore di destinazione o inserire la logica nel vostro modello di vista.

Probabilmente andrei con un convertitore qualcosa di simile (non testato).

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

È possibile utilizzare un convertitore e fare la relativa convalida su di esso.

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

e il convertitore

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

È necessario creare un convertitore per questo, che implementa 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(); 
    } 

} 

Poi in XAML si era appena fornire il convertitore per la rilegatura, (xxx rappresenta solo il tuo Window/UserControl/Style ... dove il legame è)

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

Ho bisogno di specificare una stringa di default diversa per ogni binding, ma potrei passare la stringa come ConverterParameter. – kroimon

+0

sì e basta restituire il parametro nel convertitore – Viv

+0

@Viv Perché associare alla proprietà Nome, non al testo? – Andrzej

51

DataTrigger è il mio modo di farlo in questo modo:

<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> 
+4

+1 per un approccio diverso che non utilizza un IValueConverter. – Viv

+3

+1 per non lasciare XAML – Sean

+0

Questo non si occuperebbe degli spazi bianchi ....? –

Problemi correlati