为解决这个问题,咱们能够定义一个私有变量用于保存已勾选的值。而后注册一个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 }