Question

Le DataTemplate pour la zone de liste est réglé de façon dynamique par XamlReader.Load. Je suis inscrire à l'événement Vérifié en obtenant l'objet CheckBox à l'aide VisualTreeHelper.GetChild. Cet événement ne reçoit pas tiré

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

Était-ce utile?

La solution 2

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()); };

Correction du problème

Autres conseils

Vous devez comprendre la raison pour laquelle ItemTemplate est un DataTemplate. Pour chaque élément de la liste de la boîte doit afficher appellera la méthode LoadContent (). Cela crée une nouvelle instance du contenu décrit notamment, dans ce cas, une nouvelle case à cocher. Tout cela se lie alors à l'élément lorsqu'il est désigné comme le 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éé encore une autre instance indépendante qui est utilisée nulle part dans l'interface utilisateur réelle et joint un gestionnaire d'événements à elle. Aucun des cases à cocher pour les éléments de la liste partagera ce gestionnaire d'où le code d'événement est jamais appelé.

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