2009-12-16 14 views
30

¿Hay alguna manera de tener otro enlace como valor de reserva?Encuadernación WPF FallbackValue establecido en Enlace

que estoy tratando de hacer algo como esto:

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

Si alguien tiene otro truco para llevarlo a cabo, que sería grande.

Respuesta

62

Lo que se busca es algo que se llama PriorityBinding (# 6 en this lista)

(del artículo)

El punto de PriorityBinding es nombre enlaces de datos múltiples en orden de más conveniente a menos deseable. De esta manera, si el primer enlace falla, está vacío y/o por defecto, otro enlace puede ocupar su lugar.

e.g.

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

El problema es que PriorityBinding trata una cadena nula como un enlace exitoso – Shimmy

+4

desde [MSDN] (https://msdn.microsoft.com/en-us/library/system.windows.data.prioritybinding%28v=vs.110 % 29.aspx): 'El valor DependencyProperty.UnsetValue no se considera un valor de retorno satisfactorio. Así que simplemente use un Convertidor en su enlace que devuelve esa propiedad si su valor es nulo. @Camisa –

3

¿En qué condiciones le gustaría utilizar el valor de recuperación? ¿Cómo determinarías que un enlace ha fallado? Un enlace sigue siendo válido incluso si está vinculado a un valor nulo.

Creo que una buena apuesta puede ser usar un convertidor para convertir a un valor predeterminado si el enlace devuelve nulo. Sin embargo, no estoy seguro de cómo podría establecer el valor predeterminado de otro valor encuadernado.

Salida converters here

+0

En mi caso, es donde estoy 90% seguro de que el 'DataContext' tendrá una propiedad específica, pero quiero volver a llamar a' .ToString() 'donde/si no. – tobriand

1

Si se encuentra con problemas con la unión a valores nulos y PriorityBinding (como Shimmy señaló) que podría ir con MultiBinding y una MultiValueConverter así:

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

Uso:

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