Frage

Die Datatemplate für die List-Box wird dynamisch durch XamlReader.Load. Ich bin an aufgegebenem Ereignis abonnieren, indem Sie das CheckBox-Objekt immer mit VisualTreeHelper.GetChild. Dieses Ereignis wird nicht gefeuert zu werden

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

Wie das geprüfte Ereignis behandeln? Bitte Hilfe

War es hilfreich?

Lösung 2

entfernt ItemTemplate und die folgenden Code

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

Diese feste die Ausgabe

Andere Tipps

Sie müssen den Grund verstehen, warum ItemTemplate ein DataTemplate ist. Für jedes Element muss die das Listenfeld den Loadcontent () -Methode rufen anzuzeigen. Diese erstellen eine neue Instanz des Inhalts beschrieben, einschließlich in diesem Fall eine neue Checkbox. All dies dann wird auf das Element gebunden, wenn sie als Inhalt eines ListBoxItem zugeordnet ist.

Alle Instanzen von Kontrollkästchen in diesem Fall sind unabhängige Objekte. Alles, was Sie getan haben, ist noch eine weitere unabhängige Instanz geschaffen, die nicht überall in der aktuellen Benutzeroberfläche verwendet wird, und einen Ereignishandler mit ihm verbunden. Keine der Kontrollkästchen für die Elemente in der Liste wird diese Prozedur teilen daher der Ereigniscode nie aufgerufen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top