[WPF] Comment réaliser une opération Maitre/Détails avec WPF ?
Voici une demande très fréquente lorsque l'on parle de développement Windows (que ce soit WindowsForms et/ou WebForms)
Pour réaliser une opération de ce type, avec WPF (Windows Presentation Foundation), l'astuce est vraiment très simple.
Partons du principe que nous avons une ObservableCollection de Customers: chaque Customer possède une propriété, nommée Orders, qui est (elle aussi) une ObservableCollection d'Order (vous me suivez toujours jusque là ?
)
public class Customer
{
public Customer()
{
this.Orders = new OrderCollection();
}
public string CustomerName { get; set; }
public OrderCollection Orders { get; set; }
}
public class CustomerCollection : ObservableCollection<Customer> { }
public class Order
{
public int OrderNo { get; set; }
}
public class OrderCollection : ObservableCollection<Order> { }
Ensuite, tout ce qu'il vous reste à faire, c'est de binder une ComboBox, une ListView, etc... sur votre collection de Customers: cela vous permettra d'avoir la partie "Maitre" de la relation "Maitre/Détails":
<StackPanel DataContext="{Binding Source={StaticResource Customers}}">
<ListView ItemsSource="{Binding}" DisplayMemberPath="CustomerName" IsSynchronizedWithCurrentItem="True" />
</StackPanel>
Pour finir, il faut binder un autre contrôle, qui contiendra les informations détaillées. Attention, l'astuce ici consiste à se lier directement à la collection "enfant" de notre objet, sachant que le fait de changer d'élément dans le premier contrôle mettra à jour, grâce à la propriété IsSynchronizedWithCurrentItem = True, le deuxième contrôle:
<ListView ItemsSource="{Binding Orders}" DisplayMemberPath="OrderNo" />
</StackPanel>
Et le tour est joué !
Pour que vous puissiez testé par vous-même, je vous propose de télécharger une solution d'exemple, disponible ici: ListViewWithCheckBoxes.zip
A+
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :