none
Editeur de liste de chaîne permettant la modification de chaque item RRS feed

  • Question

  • Bonjour à tous,

    J'ai un problème a priori pas très compliqué que je n'arrive pas à résoudre simplement et j'ai l'impression de m'y prendre mal. Je vais essayer d'être clair. 

    Je souhaite éditer une liste de chaîne (List(Of String)) en permettant à l'utilisateur de modifier les item de la liste. Idéalement, je voudrais donc afficher une ListBox dont chaque item serait affiché via un TextBox en lieu et place du TextBlock de l'ItemTemplate standard.  Le pb est qu'il faut binder la propriété Text du TextBox sans Path (directement au DataContext) et que le mode TwoWay n'est pas supporté dans ce cas (ce qui est bien normal). 

    La seule solution qui me vient est d'écrire une liste wrapper dont chaque élément est une instance d'une classe "Conteneur" wrappant elle même les items string de la liste wrappée via une propriété "Contenu" et de binder la propriété Text du TextBox à ce "Contenu". Pas très élégant. 

    Je me dis qu'il y a forcément plus simple. Des idées ? 

    D'avance merci. 

     

     


    Searching... wondering...
    mercredi 18 mai 2011 16:15

Réponses

  • Merci pour cette réponse. Au moins, ça me console. :)

    J'ai donc fait comme tu le suggères. Mais comme j'ai besoin de garder la synchro entre ma liste de "StringSaisie" et ma liste d'orgine, et que je n'aurai pas le pb qu'une fois, j'ai industrialisé un peu le truc. J'ai donc codé une classe générique WrapperList<T> qui wrappe n'importe quelle IList<T> et les synchronise via INotifyCollectionChanged (dans les deux sens si la liste source implémente aussi l'interface de notification). Chaque item est associé à un WrapperListItem<T> et on binde leur propriété "Content". Ca marche impec mais ça fait 300 lignes.

    Je continue quand même de trouver assez anormal qu'à notre époque, développer des trucs aussi basiques fonctionnellement puisse demander des dizaines, voire des centaines de lignes de code. Tu te rends compte ? J'ai implémenté un éditeur de liste de chaîne en WPF. Merveilleux, non ? C'est quand même assez malheureux de perdre trois heures sur un truc comme ça. Passons.

    Comme dirait l'autre, "Sorftware Develoment is too damn hard" :).

     


    Searching... wondering...
    • Marqué comme réponse Patrice O samedi 21 mai 2011 01:25
    vendredi 20 mai 2011 17:25
  • Bonjour,

     

    Je ne vois pas mieux.

    Je ne vois pas comment contourner le problème autrement que créer une classe de présentation avec une propriété de Type String.

    Et donc on donnerait à l'itemSource de la listBox une collection d'objet de présentation.

    exemple :

    public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
          this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }
    
    
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
          List<StringSaisie> chaines = new List<StringSaisie>();
          
          chaines.Add(new StringSaisie("Hello"));
          chaines.Add(new StringSaisie("Bonjour"));
          chaines.Add(new StringSaisie("test"));
          lb1.ItemsSource = chaines;
        }
    
      }
    
      public class StringSaisie
      {
        public String Libelle { get; set; }
    
        public StringSaisie(string saisie)
        {
          Libelle = saisie;
        }
      }
    

     


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    • Marqué comme réponse Patrice O samedi 21 mai 2011 01:25
    mercredi 18 mai 2011 19:31
    Modérateur

Toutes les réponses

  • Bonjour,

     

    Je ne vois pas mieux.

    Je ne vois pas comment contourner le problème autrement que créer une classe de présentation avec une propriété de Type String.

    Et donc on donnerait à l'itemSource de la listBox une collection d'objet de présentation.

    exemple :

    public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
          this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }
    
    
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
          List<StringSaisie> chaines = new List<StringSaisie>();
          
          chaines.Add(new StringSaisie("Hello"));
          chaines.Add(new StringSaisie("Bonjour"));
          chaines.Add(new StringSaisie("test"));
          lb1.ItemsSource = chaines;
        }
    
      }
    
      public class StringSaisie
      {
        public String Libelle { get; set; }
    
        public StringSaisie(string saisie)
        {
          Libelle = saisie;
        }
      }
    

     


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    • Marqué comme réponse Patrice O samedi 21 mai 2011 01:25
    mercredi 18 mai 2011 19:31
    Modérateur
  • Merci pour cette réponse. Au moins, ça me console. :)

    J'ai donc fait comme tu le suggères. Mais comme j'ai besoin de garder la synchro entre ma liste de "StringSaisie" et ma liste d'orgine, et que je n'aurai pas le pb qu'une fois, j'ai industrialisé un peu le truc. J'ai donc codé une classe générique WrapperList<T> qui wrappe n'importe quelle IList<T> et les synchronise via INotifyCollectionChanged (dans les deux sens si la liste source implémente aussi l'interface de notification). Chaque item est associé à un WrapperListItem<T> et on binde leur propriété "Content". Ca marche impec mais ça fait 300 lignes.

    Je continue quand même de trouver assez anormal qu'à notre époque, développer des trucs aussi basiques fonctionnellement puisse demander des dizaines, voire des centaines de lignes de code. Tu te rends compte ? J'ai implémenté un éditeur de liste de chaîne en WPF. Merveilleux, non ? C'est quand même assez malheureux de perdre trois heures sur un truc comme ça. Passons.

    Comme dirait l'autre, "Sorftware Develoment is too damn hard" :).

     


    Searching... wondering...
    • Marqué comme réponse Patrice O samedi 21 mai 2011 01:25
    vendredi 20 mai 2011 17:25