爲解決這個問題,咱們能夠定義一個私有變量用於保存已勾選的值。而後註冊一個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 }