Partage
  • Partager sur Facebook
  • Partager sur Twitter

Binding sur les SelectedItems d'une ListBox ne fonctionne pa

    14 juin 2011 à 15:38:47

    Voici un peu plus de détails sur mon code et mes test.
    J'ai tout mis dans le même fichier pour simplifier.

    <Window x:Class="Binding.ListBox.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:ListBox="clr-namespace:Binding.ListBox">
    		
        <StackPanel>
            <ListBox ItemsSource="{Binding Path=ListUserFull, Mode=OneWay}" DisplayMemberPath="Lastname" ListBox:ListBoxSelectedItems.SelectedItems="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=TheGroup.Users, Mode=TwoWay}" SelectionMode="Extended"/>
            <Button Content="Test" Click="Button_Click" />
        </StackPanel>
    </Window>
    


    namespace Binding.ListBox
    {
        //GUI
        public partial class MainWindow : Window
        {
            public Group TheGroup { get; set; }
            public struct StructContext
            {
                public List<User> ListUserFull { get; set; }
            }
    
            public MainWindow()
            {
                InitializeComponent();
                var context = new StructContext() { ListUserFull = new Business().UserGetAll() };
                
                TheGroup = new Business().GetOneGroup();
                TheGroup.Users = TheGroup.Users.Select(oneUser => context.ListUserFull.FirstOrDefault(u => u.Id == oneUser.Id)).ToList();
                DataContext = context;
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                if(TheGroup!=null && TheGroup.Users!=null)
                    Console.WriteLine("Il y a "+TheGroup.Users.Count+" utilisateurs selectionnés");
                else
                    Console.WriteLine("Il n'y a aucun utilisateur selectionné");
            }
        }
    
        //BLL
        public class Business
        {
            public List<User> UserGetAll()
            {
                return new List<User>{
                               new User(1, "DUPOND", "Martin"),
                               new User(2, "DURAND", "François"),
                               new User(3, "MACHIN", "Marc"),
                               new User(4, "GILLES", "Franck")
                           };
            }
    
            public Group GetOneGroup()
            {
                return new Group{
                               Users = new List<User>{
                                         new User(1, "DUPOND", "Martin"),
                                         new User(2, "DURAND", "François")
                                     }
                           };
            }
        }
    
        //ENTITY
        public class Group
        {
            public List<User> Users { get; set; }
        }
    
        public class User
        {
            public User(long id, string lastname, string firstname)
            {
                Id = id;
                Lastname = lastname;
                Firstname = firstname;
            }
    
            public long Id { get; set; }
            public string Lastname { get; set; }
            public string Firstname { get; set; }
        }
    
        //BEHAVIOR
        public static class ListBoxSelectedItems
        {
            public static void SetSelectedItems(System.Windows.Controls.ListBox listbox, IList list) { listbox.SetValue(SelectedItemsProperty, list); }
            public static IList GetSelectedItems(System.Windows.Controls.ListBox listbox) { return listbox.GetValue(SelectedItemsProperty) as IList; }
            public static DependencyProperty SelectedItemsProperty = DependencyProperty.RegisterAttached("SelectedItems", typeof(IList), typeof(ListBoxSelectedItems), new PropertyMetadata(null, new PropertyChangedCallback(SelectedItemsProperty_Changed)));
    
            private static void SelectedItemsProperty_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if (!(d is System.Windows.Controls.ListBox) || !(e.NewValue is IList)) return;
    
                ((System.Windows.Controls.ListBox)d).SelectedItems.Clear();
                foreach (var oneValue in ((IList)e.NewValue))
                    ((System.Windows.Controls.ListBox)d).SelectedItems.Add(oneValue);
    
                ((System.Windows.Controls.ListBox)d).SelectionChanged += ListBox_SelectionChanged;
            }
    
            private static void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (!(sender is System.Windows.Controls.ListBox)) return;
            }
        }
    }
    
    A ce niveau là:
    1) Lorsque je charge ma page j'ai bien les deux premiers items de selectionnés
    2) Lorsque je clique sur le bouton, il y a bien deux items.
    3) Si je sélectionne 3 items et que je clique sur le bouton il ne connait que les deux premiers.


    Je modifie donc la méthode SelectionChanged
    private static void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (!(sender is System.Windows.Controls.ListBox)) return;
                var theListbox = sender as System.Windows.Controls.ListBox;
                SetSelectedItems(theListbox, theListbox.SelectedItems);
            }
    

    A ce niveau là:
    1) IDEM
    2) IDEM
    3) Si je sélectionne 3 items et que je clique sur le bouton, j'obtiens la valeur null.


    Je ne comprend pas pourquoi. Quelqu’un a t'il une idée?
    • Partager sur Facebook
    • Partager sur Twitter
      14 juin 2011 à 15:41:47

      Essaie ca :

      ListBox theListbox = sender as ListBox;
      MessageBox.Show(theListbox.SelectedItems.Count.ToString());
      • Partager sur Facebook
      • Partager sur Twitter

      Binding sur les SelectedItems d'une ListBox ne fonctionne pa

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown