Silverlight 3.0 Custom Listbox Datatemplate يحتوي على خانة اختيار ، وحدث تم فحصه بعدم إطلاق النار

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

سؤال

يتم تعيين datatemplate لـ ListBox ديناميكيًا بواسطة xamlReader.load. أنا أشترك في فحص الحدث عن طريق الحصول على كائن مربع الاختيار باستخدام 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. لكل عنصر ، يحتاج مربع القائمة إلى عرضه ، وسيقوم باستدعاء طريقة LoadContent (). هذا ينشئ مثيلًا جديدًا للمحتوى الموضح بما في ذلك ، في هذه الحالة ، مربع اختيار جديد. كل هذا يلتزم بعد ذلك بالعنصر عند تعيينه كمحتوى لـ ListBoxItem.

جميع مثيلات مربع الاختيار في هذه الحالة هي كائنات مستقلة. كل ما قمت به يتم إنشاء مثيل مستقل آخر لا يستخدم في أي مكان في واجهة المستخدم الفعلية وربط معالج الأحداث به. لن يشارك أي من مربعات الاختيار للعناصر الموجودة في القائمة هذا المعالج وبالتالي لا يتم استدعاء رمز الحدث أبدًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top