2010-04-08 65 views
1

我想獲取選定的行,但selecteditems只有一行。我想得到所有檢查的項目。我想我需要添加事件處理程序時,複選框被清除,然後收集所有。我如何以最佳方式做到這一點?Wpf工具包datagrid DataGridCheckBoxColumn on_click事件:

+0

你想使用複選框或只支持多選?選擇是項目上的藍色突出顯示,與是否檢查給定列完全不同。 – 2010-04-09 20:21:22

回答

1

您是否使用數據綁定來填充您的DataGrid?如果是這樣,將列的選中值綁定到您的支持對象中的布爾值可能是「最好的」(如在:最佳實踐)方式來做到這一點。下面是一些示例代碼:

<Window x:Class="CheckGridSample.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:tk="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <tk:DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False"> 
      <tk:DataGrid.Columns> 
       <tk:DataGridTextColumn Header="Name" Binding="{Binding Name}" /> 
       <tk:DataGridCheckBoxColumn Header="Selected" Binding="{Binding IsChecked}" /> 
      </tk:DataGrid.Columns> 
     </tk:DataGrid> 
     <Button Content="Which Items Are Checked?" Click="Button_Click" /> 
    </StackPanel> 
</Window> 

using System; 
using System.Linq; 
using System.Text; 
using System.Windows; 

namespace CheckGridSample 
{ 
    public partial class Window1 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      DataContext = new[] 
       { 
        new MyModel {Name = "Able"}, 
        new MyModel {Name = "Baker", IsChecked = true}, 
        new MyModel {Name = "Charlie"} 
       }; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      var builder = new StringBuilder(); 
      foreach (var item in ((MyModel[]) DataContext).Where(m => m.IsChecked)) 
       builder.Append(Environment.NewLine + item.Name); 
      MessageBox.Show("Checked:" + builder); 
     } 
    } 

    public class MyModel 
    { 
     public string Name { get; set; } 
     public bool IsChecked { get; set; } 
    } 
}