Silverlight 3.0自定义ListBox DataTemplate有一个复选框,检查事件未触发

时间:2010-05-11 14:39:39

标签: silverlight silverlight-3.0 listbox datatemplate xamlreader

ListBox的datatemplate由XamlReader.Load动态设置。我通过使用VisualTreeHelper.GetChild获取CheckBox对象来订阅Checked事件。这个事件没有被解雇

代码段

    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 个答案:

答案 0 :(得分:1)

您需要了解ItemTemplateDataTemplate的原因。对于列表框需要显示的每个项目,它将调用LoadContent()方法。这创建了所描述内容的新实例,在这种情况下,包括新的复选框。当它被指定为ListBoxItem的内容时,所有这一切都被绑定到项目。

在这种情况下,复选框的所有实例都是独立的对象。您所做的就是创建另一个独立实例,该实例不会在实际UI中的任何位置使用,并为其附加事件处理程序。列表中项目的复选框都不会共享此处理程序,因此永远不会调用事件代码。

答案 1 :(得分:0)

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

这解决了问题