綜合應用WPF/WCF/WF/LINQ之四十:實現一個簡單的DataGrid之CheckBox已勾選的項的保存

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