Question

J'ai placé dans un conteneur ItemsControl (Template Stackpanel) mes UserControls, qui sont ajoutés et supprimés de manière dynamique lors de l'exécution de l'application. Comment puis-je router un événement (par exemple, TextChanged ou GotFocus) via tous les éléments de mon UserControl (constitué principalement de zones de texte)? Est-ce là que je devrais utiliser "Délégués"? ou ICommand? Je suis novice dans ce domaine et probablement je mélange certaines choses.

Merci!

Était-ce utile?

La solution

Je lis assez souvent entre les lignes de votre question, mais je suppose que vous souhaitez attacher (et détacher) des gestionnaires d'événements à chacun de vos enfants de contrôles à mesure qu'ils sont ajoutés (et supprimés).

Essayez de définir votre ItemsSource sur ObservableCollection. Vous pouvez ensuite attacher un gestionnaire d'événements à votre événement ObservableCollection.CollectionChanged. Dans ledit gestionnaire d'événements, vous pouvez attacher ou dissocier des gestionnaires d'événements à vos enfants à mesure qu'ils sont ajoutés et supprimés.

public class MyContainer : StackPanel
{
   public MyContainer()
   {
      this.ItemsSource = MyCollection;
   }

   ObservableCollection<UIElement> myCollection;
   public ObservableCollection<UIElement> MyCollection
   {
      get
      {
         if (myCollection == null)
         {
             myCollection = new ObservableCollection<UIElement>();
             myCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(myCollection_CollectionChanged);
         }
         return myCollection;
   }

   void myCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
   {
       foreach (UIElement removed in e.OldItems)
       {
          if (added is TextBox)
             (added as TextBox).TextChanged -= new Removeyoureventhandler here...

          if (added is someotherclass)
             (added as someotherclass).someotherevent += Removesomeothereventhandler here...              
       }

       foreach (UIElement added in e.NewItems)
       {
          if (added is TextBox)
             (added as TextBox).TextChanged += new Addyoureventhandler here...

          if (added is someotherclass)
             (added as someotherclass).someotherevent += Addsomeothereventhandler here...
       }

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top