Domanda

Il DataTemplate per la ListBox è impostata in modo dinamico dalla XamlReader.Load. Desidero registrarmi alle manifestazione Controllato da ottenere l'oggetto CheckBox utilizzando VisualTreeHelper.GetChild. Questo evento non è essere stato licenziato

Snippet di codice

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

Come gestire l'evento controllato? Si prega di aiuto

È stato utile?

Soluzione 2

Rimosso ItemTemplate e ha aggiunto la sottostante Codice

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

Questo risolto il problema

Altri suggerimenti

È necessario capire il motivo per cui è un ItemTemplate DataTemplate. Per ogni articolo la casella della lista deve visualizzare chiamerà il metodo LoadContent (). Questo crea una nuova istanza del contenuto descritto compresi, in questo caso, una nuova casella. Tutto questo poi viene legato alla voce quando viene assegnato come il contenuto di un ListBoxItem.

Tutte le istanze di casella di controllo in questo caso sono oggetti indipendenti. Tutto quello che avete fatto è stato creato l'ennesimo esempio indipendente che non viene utilizzato in qualsiasi parte del reale interfaccia utente e attaccato un gestore di eventi ad esso. Nessuna delle caselle di controllo per gli elementi dell'elenco condividerà questo gestore da cui il codice evento non viene mai chiamato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top