稍稍增加一点难度,我们让记录列表中嵌入一组CheckBox,以便用户选择,之后,用户就可以编辑或者删除所选择的记录了。其效果如下:

  这里,我们使用一个DataTemplate来容纳CheckBox控件。注意,公布的源代码中,使用的是Click事件,但使用这个事件可能会导致一些小Bug,所以现在改成了Checked和Unchecked。
  为了实现绑定数据,我们可以在GridView控件的GridViewColumn中加入DisplayMemberBinding="{Binding Path=FunctionName}"这样的属性。
  下面的翻页控件是一个自定义的UserControl。关于UserControl的编写,将在后续文章中介绍。
    1      < Page.Resources >
    2          < DataTemplate x : Key ="CheckBox">
    3              < CheckBox Name ="chkSelect" Checked ="chkSelect_Checked" Unchecked ="chkSelect_Unchecked" />
    4          </ DataTemplate >
    5      </ Page.Resources >
    6      < Grid VerticalAlignment ="Top">
    7          < ListView Name ="grdGrid" Margin ="4,86,0,24" MinHeight ="155" MouseDoubleClick ="grdGrid_MouseDoubleClick" ItemsSource ="{ Binding }">
    8              < ListView.View >
    9                  < GridView >
   10                      < GridViewColumn CellTemplate ="{ StaticResource CheckBox }" Width ="25" />
   11                      < GridViewColumn Header ="Function Name" DisplayMemberBinding ="{ Binding Path =FunctionName}" Width ="200" />
   12                      < GridViewColumn Header ="Function Description" DisplayMemberBinding ="{ Binding Path =FunctionDescription}" Width ="525" />
   13                  </ GridView >
   14              </ ListView.View >
   15          </ ListView >
   16          < common : Pager Name ="ctlPager" PageChanged ="ctlPager_PageChanged" Height ="22" VerticalAlignment ="Bottom" HorizontalAlignment ="Right" />
   17      </ Grid >
  后台代码如下:
  我们用一个_SelectedItems变量保存已选择的对象,避免遍历循环控件去判断哪些被选中了。
  这里有多个事件中加入了if (this.grdGrid.IsInRow() == false) return;这样的语句,这是因为在很少的情况下,如果鼠标正好处在两行之间的微小空隙中,系统会认为选中了整个Grid,所以我们需要做一些判断。其中IsInRow是一个扩展方法,将在下一篇文章中介绍。另外,GetControl也是一个扩展方法,用于找到模板列中的控件,将在下一篇文章中介绍。
    1         private ArrayList _SelectedItems = new ArrayList();
    2 
    3         private void chkSelect_Checked( object sender, RoutedEventArgs e)
    4         {
    5             try
    6             {
    7                 if ( this.grdGrid.IsInRow() == false) return;
    8 
    9                 this.SetEnabled(( CheckBox)sender, (( FunctionInfo) this.grdGrid.GetItem()).FunctionId);
   10 
   11                 e.Handled = false;
   12             }
   13             catch
   14             {
   15                 throw;
   16             }
   17         }
   18 
   19         private void chkSelect_Unchecked( object sender, RoutedEventArgs e)
   20         {
   21             try
   22             {
   23                 if ( this.grdGrid.IsInRow() == false) return;
   24 
   25                 this.SetEnabled(( CheckBox)sender, (( FunctionInfo) this.grdGrid.GetItem()).FunctionId);
   26 
   27                 e.Handled = false;
   28             }
   29             catch
   30             {
   31                 throw;
   32             }
   33         }
   34 
   35         private void grdGrid_MouseDoubleClick( object sender, MouseButtonEventArgs e)
   36         {           
   37             try
   38             {
   39                 if ( this.grdGrid.IsInRow() == false) return;
   40 
   41                 CheckBox control = ( CheckBox) this.grdGrid.GetControl( "chkSelect");
   42 
   43                 control.IsChecked = (control.IsChecked == false);
   44             }
   45             catch
   46             {
   47                 throw;
   48             }
   49         }
   50 
   51         private void SetEnabled( CheckBox control, object value)
   52         {
   53             try
   54             {
   55                 if (control.IsChecked == true) this._SelectedItems.Add(value);
   56                 if (control.IsChecked != true) this._SelectedItems.Remove(value);
   57             }
   58             catch
   59             {
   60                 throw;
   61             }