为解决这个问题,我们可以定义一个私有变量用于保存已勾选的值。然后注册一个CheckBox.CheckedEvent事件,一个CheckBox.UncheckedEvent事件,并在相应的RoutedEventHandler指定的方法中添加或者移除当前勾选的值。
  现在剩下的麻烦事情就是为各行中的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);
  这样一来,程序就会在比UI层的级别更高的任务完毕后,调用设置CheckBox的IsChecked属性的方法了。
  具体的赋值方法就比较简单了:
    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 }