1

Le datatemplate de ListBox est défini dynamiquement par XamlReader.Load. Je suis abonné à l'événement Checked en obtenant l'objet CheckBox en utilisant VisualTreeHelper.GetChild. Cet événement ne reçoit pas tiréSilverlight 3.0 Custom ListBox DataTemplate a une case à cocher, l'événement vérifié ne se déclenche pas

Code Snippet

public void SetListBox() 
    { 
     lstBox.ItemTemplate = 
     XamlReader.Load(@"<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' x:Name=""DropDownTemplate""><Grid x:Name='RootElement'><CheckBox x:Name='ChkList' Content='{Binding " + TextContent + "}' IsChecked='{Binding " + BindValue + ", Mode=TwoWay}'/></Grid></DataTemplate>") as DataTemplate; 

     CheckBox chkList = (CheckBox)GetChildObject((DependencyObject)_lstBox.ItemTemplate.LoadContent(), "ChkList"); 

     chkList.Checked += delegate { SetSelectedItemText(); }; 
    } 

    public CheckBox GetChildObject(DependencyObject obj, string name) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      DependencyObject c = VisualTreeHelper.GetChild(obj, i); 
      if (c.GetType().Equals(typeof(CheckBox)) && (String.IsNullOrEmpty(name) || ((FrameworkElement)c).Name == name)) 
      { 
       return (CheckBox)c; 
      } 
      DependencyObject gc = GetChildObject(c, name); 
      if (gc != null) 
       return (CheckBox)gc; 
     } 
     return null; 
    } 

Comment gérer l'événement contrôlé? S'il vous plaît aider

Répondre

0

Suppression ItemTemplate et ajouté le code ci-dessous

   var checkBox = new CheckBox { DataContext = item }; 
       if (string.IsNullOrEmpty(TextContent)) checkBox.Content = item.ToString(); 
       else 
        checkBox.SetBinding(ContentControl.ContentProperty, 
             new Binding(TextContent) { Mode = BindingMode.OneWay }); 
       if (!string.IsNullOrEmpty(BindValue)) 
        checkBox.SetBinding(ToggleButton.IsCheckedProperty, 
             new Binding(BindValue) { Mode = BindingMode.TwoWay }); 
       checkBox.SetBinding(IsEnabledProperty, new Binding("IsEnabled") { Mode = BindingMode.OneWay }); 
       checkBox.Checked += (sender, RoutedEventArgs) => { SetSelectedItemText(true, ((CheckBox)sender).GetValue(CheckBox.ContentProperty).ToString()); }; 
       checkBox.Unchecked += (sender, RoutedEventArgs) => { SetSelectedItemText(true, ((CheckBox)sender).GetValue(CheckBox.ContentProperty).ToString()); }; 

Ce résolu le problème

1

Vous devez comprendre la raison pour laquelle ItemTemplate est DataTemplate. Pour chaque élément que la zone de liste doit afficher, elle appelle la méthode LoadContent(). Cela crée une nouvelle instance du contenu décrit y compris, dans ce cas, une nouvelle case à cocher. Tout ceci est ensuite lié à l'élément lorsqu'il est affecté en tant que contenu d'un ListBoxItem.

Toutes les instances de case à cocher dans ce cas sont des objets indépendants. Tout ce que vous avez fait est créé une autre instance indépendante qui n'est utilisée nulle part dans l'interface utilisateur réelle et attaché un gestionnaire d'événements. Aucune case à cocher pour les éléments de la liste ne partagera ce gestionnaire, d'où le code d'événement n'est jamais appelé.

+0

Merci pour votre réponse. Mais comment puis-je gérer l'événement vérifié? – Bhaskar