WPF France

  • Augmenter la taille
  • Taille par défaut
  • Diminuer la taille

MVVM Listbox Multi-Selection Synchronisé avec le ViewModel

Envoyer Imprimer PDF
Note des utilisateurs: / 2
MauvaisTrès bien 

(Article original blog de Sébastien)

J’ai été confronté récemment à un problème avec le Pattern MVVM. En faite je me suis posé la question de savoir comment il était possible de synchroniser mon ViewModel avec les éléments sélectionnés d’une Listbox (ou encore de façon plus général à la propritété « SelectedItems » d’un contrôle si elle existe) .

Après quelques recherche sur le web je suis tombé sur le blog de Marlon qui propose une idée très intéressante. En effet la solution est de passer par une simple propriété attachés qui grâce à l’événement SelectionChanged de la ListBox va alimenter une liste de mon ViewModel.

Voici la classe en question que j’ai appelé « SelectedItemsHelper » :

public static class SelectedItemsHelper
{
/// 
/// SelectedItems Attached Dependency Property
/// 
public static readonly DependencyProperty SelectedItemsProperty =

DependencyProperty.RegisterAttached("SelectedItems", typeof(IList), typeof(SelectedItemsHelper),
new FrameworkPropertyMetadata((IList)null,
new PropertyChangedCallback(OnSelectedItemsChanged)));
/// 
/// Gets the SelectedItems property. This dependency property
/// 
/// 
/// 
public static IList GetSelectedItems(DependencyObject d)
{
return (IList)d.GetValue(SelectedItemsProperty);

}

/// 
/// Sets the SelectedItems property. This dependency property
/// indicates ....
/// 
public static void SetSelectedItems(DependencyObject d, IList value)
{
d.SetValue(SelectedItemsProperty, value);
}

/// 
/// Handles changes to the SelectedItems property.
/// 
private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var listBox = (ListBox)d;
ReSetSelectedItems(listBox);
listBox.SelectionChanged += delegate
{
ReSetSelectedItems(listBox);
};
}

private static void ReSetSelectedItems(ListBox listBox)
{
IList selectedItems = GetSelectedItems(listBox);
selectedItems.Clear();
if (listBox.SelectedItems != null)
{
foreach (var item in listBox.SelectedItems)
selectedItems.Add(item);
}
}
}

Dernier point, l’utilisation dans le XAML :

<ListBox ItemsSource="{Binding Personnes}" helper:SelectedItemsHelper.SelectedItems="{Binding PersonnesSelected}" SelectionMode="Extended"/>
 

Voilà vous pouvez ainsi récupérer dans la liste les éléments sélectionnés de la listbox.

Sébastien.

(Article original blog de Sébastien)

Commentaires (1)
Mise à jour le Mardi, 06 Avril 2010 12:44  

Partagez


Article au hasard

  • Cet article explique succinctement comment utiliser la classe SyndicationFeed pour manipuler un flux RSS ou Atom, et illustre la puissance du mécanisme de binding de WPF pour afficher dans une application les données de ce flux, le tout avec un minimum de code.


    Commentaires (0)...
    Lire la suite...