Silverlight 3.0 Пользовательский список данных DataTembless имеет флажок, проверенное событие не стрельба

StackOverflow https://stackoverflow.com/questions/2811616

Вопрос

DataTemplate для ListBox динамически устанавливается XAMLREADER.Load. Я подписываюсь на проверенное событие, получив объект Checkbox, используя VisualTreeHelper.GetChild. Это событие не уволено

Кодовый фрагмент

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

Как обрабатывать проверенное событие? Пожалуйста помоги

Это было полезно?

Решение 2

Удалил itemTemplate и добавил код ниже

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

Это исправлено проблему

Другие советы

Вы должны понять причину, почему ItemTemplate это DataTemplate. Отказ Для каждого элемента необходимо отобразить флажок «Список списка», позвонит методу LastContent (). Это создает новый экземпляр описанного содержимого, включая в этом случае новый флажок. Все это затем связано с элементом, когда оно присваивается как содержимое listboxItem.

Все экземпляры флажков в этом случае являются независимыми объектами. Все, что вы сделали, создано еще один независимый экземпляр, который не используется нигде в реальном пользовательском интерфейсе и приложил к нему обработчик событий. Ни один из флажков для элементов в списке не будет делиться этим обработчиком, следовательно, код события никогда не вызывается.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top