WPF ItemsControl: route l'événement TextChanged vers tous les éléments UserControl
-
06-07-2019 - |
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!
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...
}
}