稍稍增加一点难度,我们让记录列表中嵌入一组CheckBox,以便用户选择,之后,用户就可以编辑或者删除所选择的记录了。其效果如下:
综合应用WPF/WCF/WF/LINQ之十九:实现页面中的记录列表_休闲
  这里,我们使用一个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             }