2009-08-26 4 views
1

Compte tenu de cet objetXAML se lier à l'élément indexé dans la propriété de la liaison

class Contact 
{ 
    public IEnumerable<Person> People { get; } 
    public string PhoneNumber { get; } 
} 

class Person 
{ 
    public string MobileNumber { get; } 
} 

Et la mise en page suivante

<Contact> 
    <PhoneNumber/> 
    <SinglePerson.MobileNumber/> 
    <People> 
     <MobileNumber /> 
    </People> 
<Contact> 

Ce que je voudrais faire est de cacher l'élément populaire quand il n'y a qu'un seul personne, et affiche l'élément numéro SinglePerson.Mobile à la place.

Hiding est assez facile:

<Style.Triggers> 
    <DataTrigger Binding="{Binding Path=People.Count}" Value="1"> 
     <Setter Property="Visibility" Value="Collapsed" /> 
    </DataTrigger> 
</Style.Triggers> 

Affichage est un peu plus délicat:

<Setter Property="Visibility" Value="Collapsed"/> 
<Style.Triggers> 
    <DataTrigger Binding="{Binding Path=People.Count}" Value="1"> 
     <Setter Property="Visibility" Value="Visible" /> 
    </DataTrigger> 
</Style.Triggers> 

La seule chose que je ne peux pas travailler comment faire est de lier le <SinglePerson.MobileNumber> texte à la première personne dans la liste des personnes. J'ai essayé des variantes de "{Binding People [0] .MobilePhone}", mais cela ne fonctionne pas.

Est-ce encore possible?

Répondre

1

Il est en réalité beaucoup plus facile, si vous voulez seulement obtenir le premier élément d'une collection. Si vous faites référence à la propriété désirée, WPF sélectionne automatiquement la valeur pour le premier élément de la collection:

<DataTrigger Binding="{Binding People/MobileNumber}" Value=""> 
    <Setter Property="Visibility" Value="Collapsed" /> 
</DataTrigger> 

(de IanG)

2

Il peut y avoir d'autres façons, mais j'ai résolu cela dans le passé en créant un convertisseur de valeur (une classe nommée PersonIndexerConverter qui implémente IValueConverter). La conversion peut prendre un paramètre qui est votre index. Passez l'index en tant que parementer dans le code XAML. La liaison devient un peu plus compliquée, mais vous obtenez votre indexation.

+0

Cool, fonctionne bien pour moi, je l'ai fait une FirstPersonMobileConverter (je pouvais ont décidé de passer dans le nom de la propriété en tant que paramètre, ce sera pour la prochaine version). – Benjol

Questions connexes