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