2009-12-16 22 views
30

C'è un modo per avere un altro bind come valore di fallback?WPF Binding FallbackValue impostato su Binding

sto cercando di fare qualcosa di simile:

<Label Content="{Binding SelectedItem.Name, ElementName=groupTreeView, 
         FallbackValue={Binding RootGroup.Name}}" /> 

Se qualcuno ce l'ha un altro trucco per tirarlo fuori, che sarebbe grande.

risposta

62

Quello che state cercando è qualcosa che si chiama PriorityBinding (# 6 su this lista)

(dall'articolo)

Il punto da PriorityBinding è quello di nome più collegamenti dati nell'ordine dei più desiderabili ai meno desiderabili. In questo modo se il primo collegamento fallisce, è vuoto e/o predefinito, un altro binding può prendere la sua posizione.

ad es.

<TextBox> 
    <TextBox.Text> 
     <PriorityBinding> 
      <Binding Path="LastNameNonExistant" IsAsync="True" /> 
      <Binding Path="FirstName" IsAsync="True" /> 
     </PriorityBinding> 
    </TextBox.Text> 
</TextBox> 
+23

Il problema è che PriorityBinding tratta una stringa nulla come vincolante con successo – Shimmy

+4

da [MSDN] (https://msdn.microsoft.com/en-us/library/system.windows.data.prioritybinding%28v=vs.110 % 29.aspx): 'Il valore DependencyProperty.UnsetValue non è considerato un valore restituito con esito positivo. - Quindi, utilizzare un convertitore sull'associazione che restituisce tale proprietà se il valore è nullo. @Shimmy –

3

In quali condizioni ti piacerebbe utilizzare il valore Fallback? Come stabiliresti che un legame è fallito? Un legame è ancora valido anche se è associato a un valore nullo.

Penso che una buona scommessa potrebbe essere quella di utilizzare un convertitore per convertire in un valore predefinito se l'associazione restituisce null. Non sono sicuro di come potresti default ad un altro valore associato.

Partenza converters here

+0

Nel mio caso, è dove sono sicuro al 90% che il 'DataContext' avrà una proprietà specifica su di esso, ma voglio tornare a chiamare' .ToString() 'dove/se non lo fa. – tobriand

1

Se si esegue in problemi con il legame ai valori nulli e PriorityBinding (come Shimmy sottolineato) si potrebbe andare con MultiBinding e un MultiValueConverter del genere:

public class PriorityMultiValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return values.FirstOrDefault(o => o != null); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Usage:

<TextBox> 
    <TextBox.Text> 
     <MultiBinding Converter="{StaticResource PriorityMultiValueConverter}"> 
      <Binding Path="LastNameNull" /> 
      <Binding Path="FirstName" /> 
     </MultiBinding> 
    </TextBox.Text> 
</TextBox>