为解决这个问题,我们可以定义一个私有变量用于保存已勾选的值。然后注册一个CheckBox.CheckedEvent事件,一个CheckBox.UncheckedEvent事件,并在相应的RoutedEventHandler指定的方法中添加或者移除当前勾选的值。
现在剩下的麻烦事情就是为各行中的CheckBox控件设置IsChecked属性了。我们在前面的文章中已经介绍过了如何找到一个控件,但在这里,我们却发现总是报错,提示this.ItemContainerGenerator.ContainerFromItem(item)为空。
这是因为在Binding方法执行完之前,该控件的VisualTree还没有来得及生成。为了等待VisualTree的生成,我们需要使用WPF中的线程技术。您可能在以前的代码中经常用到this.Invoke方法,但在WPF中,您却需要使用this.Dispatcher.Invoke方法。其代码如下:
这样一来,程序就会在比UI层的级别更高的任务完毕后,调用设置CheckBox的IsChecked属性的方法了。
具体的赋值方法就比较简单了:
现在剩下的麻烦事情就是为各行中的CheckBox控件设置IsChecked属性了。我们在前面的文章中已经介绍过了如何找到一个控件,但在这里,我们却发现总是报错,提示this.ItemContainerGenerator.ContainerFromItem(item)为空。
这是因为在Binding方法执行完之前,该控件的VisualTree还没有来得及生成。为了等待VisualTree的生成,我们需要使用WPF中的线程技术。您可能在以前的代码中经常用到this.Invoke方法,但在WPF中,您却需要使用this.Dispatcher.Invoke方法。其代码如下:
1 this.Dispatcher.Invoke(DispatcherPriority.ContextIdle, (InvokeDelegate)this.SetCheckBoxIsCheckeds);
具体的赋值方法就比较简单了:
1 foreach (int key in this._CheckBoxCheckedValues.Keys)
2 {
3 string name = "CheckBox" + key.ToString();
4
5 foreach (int value in this._CheckBoxCheckedValues[key])
6 {
7 object item = (this.ItemsSource as IList)[value];
8
9 ContentPresenter presenter = this.ItemContainerGenerator.ContainerFromItem(item).GetPresenter(name);
10 DataGridCheckBox checkbox = presenter.ContentTemplate.FindName(name, presenter) as DataGridCheckBox;
11
12 checkbox.IsChecked = true;
13 }
14 }
转载于:https://blog.51cto.com/eallies/78986