Pregunta

El DataTemplate para el ListBox se establece dinámicamente por XamlReader.Load. Me inscribo a eventos Revisado por conseguir el objeto CheckBox usando VisualTreeHelper.GetChild. Este evento no es ser despedido

Fragmento de código

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

Cómo controlar el evento registrado? Por favor, ayuda

¿Fue útil?

Solución 2

Se ha quitado ItemTemplate y añadido el siguiente código

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

Esto fija el tema

Otros consejos

Es necesario comprender la razón por la ItemTemplate es un DataTemplate. Para cada elemento del cuadro de la lista tiene que mostrar que llamará al método LoadContent (). Esto crea una nueva instancia del contenido de describir, que incluye, en este caso, una casilla de verificación nueva. Todo esto, entonces se une al elemento cuando se asigna como el contenido de un ListBoxItem.

Todas las instancias de casilla de verificación en este caso son objetos independientes. Todo lo que ha hecho se crea una nueva instancia independiente que no se utiliza en cualquier parte de la interfaz de usuario actual y adjunta un controlador de eventos a la misma. Ninguna de las casillas de verificación de los elementos de la lista compartirá este controlador de ahí el código de evento nunca es llamado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top