2009-12-16 5 views
30

Existe-t-il un moyen d'avoir une autre liaison en tant que valeur de repli?WPF Liaison FallbackValue définie sur Liaison

Je suis en train de faire quelque chose comme ceci:

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

Si quelqu'un a obtenu une autre astuce de le retirer, ce serait génial.

Répondre

62

Ce que vous recherchez est quelque chose appelé PriorityBinding (# 6 sur this liste)

(de l'article)

Le point à PriorityBinding est de nom plusieurs liaisons de données dans l'ordre du plus souhaitable au moins souhaitable. De cette façon, si la première liaison échoue, est vide et/ou par défaut, une autre liaison peut prendre sa place.

par exemple.

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

Le problème est que PriorityBinding traite une chaîne nulle comme une liaison réussie – Shimmy

+4

à partir du [MSDN] (https://msdn.microsoft.com/en-us/library/system.windows.data.prioritybinding%28v=vs.110 % 29.aspx): 'La valeur DependencyProperty.UnsetValue n'est pas considérée comme une valeur de retour réussie. '- utilisez simplement un convertisseur sur votre liaison qui renvoie cette propriété si votre valeur est null. @Shimmy –

3

Dans quelles conditions souhaitez-vous utiliser la valeur de repli? Comment détermineriez-vous qu'une reliure a échoué? Une liaison est toujours valide même si elle est liée à une valeur nulle.

Je pense qu'un bon pari peut être d'utiliser un convertisseur pour convertir à une valeur par défaut si la liaison retourne null. Je ne suis pas sûr de savoir comment vous pourriez par défaut à une autre valeur liée.

Découvrez converters here

+0

Dans mon cas, c'est 90% + que le 'DataContext' aura une propriété spécifique, mais je veux revenir à l'appel de' .ToString() 'où/si ce n'est pas le cas. – tobriand

1

Si vous avez un problème avec la liaison à des valeurs nulles et PriorityBinding (comme Shimmy souligné), vous pouvez aller avec MultiBinding et un MultiValueConverter comme ça:

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

Utilisation:

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