2010-05-29 8 views
0
  • J'ai la fenêtre qui a un ListBox
  • ListBox (MyListBox) a un DataTable pour son DataContext
  • ItemSource de
  • ListBox est: {Reliure}
  • Listbox a un UserControl (MyUserControl) comme DataTemplate
  • UserControl a RadioButtons et TextBoxes (Au début, ils sont remplis de valeurs de DataTable et l'utilisateur peut les modifier) ​​
  • fenêtre a un bouton Envoyer

Ce que je veux faire est, lorsque l'utilisateur clique sur le bouton SoumettreWPF Accès aux éléments à l'intérieur Listbox qui a un UserControl comme ItemTemplate

  • Pour chaque ListBox article, obtenir les valeurs forment les zones de texte et de RadioButtons UserControl.

J'utilisait cette méthode pour ce travail:

foreach(var element in MyListBox.Items) 
{ 
    var border = MyListBox.ItemContainerGenerator.ContainerFromItem(element)as FrameworkElement; 
    MyUserControl currentControl = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(myBorder,0) as Border,0)as ContentPresenter,0)as MyUserControl; 
    //And use currentControl 
} 

Je réalise rien lors de l'utilisation 3-5 articles dans Listbox. Mais quand j'ai utilisé beaucoup plus d'objets, j'ai vu que "var border" devenait "nul" après que certains éléments aient été bouclés dans la fonction foreach.

Je trouve la raison ici: ListView.ItemContainerGenerator.ContainerFromItem(item) return null after 20 items

Que puis-je faire maintenant? Je veux accéder à tous les éléments et obtenir leurs valeurs assis sur les contrôles de l'utilisateur.

Merci

Répondre

0

Vous devez utiliser des objets qui mettent en œuvre INotifyPropertyChanged et lier un ObservableCollection de celui-ci à la ItemSource Et puis vous pouvez obtenir toute la liste des articles.

Voici quelques liens rapides de MSDN pour obtenir plus d'informations How to: Implement Property Change Notification Binding Sources Overview

Vous devez google pour quelques tutoriels à ce sujet.

+0

Merci pour la solution;) – Turker

0

poste de Zied est une solution pour ce problème. Mais j'ai fait ce qui suit pour mon projet:

  • J'ai réalisé qu'il n'est pas nécessaire d'utiliser UserControl comme DataTemplate dans mon projet. J'ai donc supprimé DataTemplate de ListBox.
  • J'ai enlevé et utilisé MyListBox.DataContext = myDataTable ceci:

    foreach(DataRow dr in myDataTable.Rows) 
    { 
    MyUserControl muc = new MyUserControl(dr); 
    myListBox.Items.Add(muc); 
    } 
    
  • Je pris DataRow dans le constructeur de mon UserControl et fait ce que je veux.
  • Et enfin je pouvais accéder à mes UserControls dans ListBox en utilisant:
    foreach(MyUserControl muc in 
    myListBox) 
    { 
    //do what you want 
    } 
    

facile hein? :)