2012-10-26 35 views
5

私は1つのCheckBoxColumnを持つDataGridを持っています。そのCheckBoxColumnのヘッダに、そのDatagrid RowのすべてのCheckBoxを選択するためのCheckBoxを追加しました。WPF DataGridのDataGridヘッダーチェックボックスで列のすべてのCheckBoxを選択する方法

どうすれば実現できますか?

私のXAMLコードWPF用のDataGrid:私はデータグリッドの行のすべてのチェックボックスを選択するチェックボックスを追加した

<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" Grid.RowSpan="2" Height="130" HorizontalAlignment="Left" IsReadOnly="False" Margin="189,340,0,0" Name="dgCandidate" TabIndex="7" VerticalAlignment="Top" Width="466" Grid.Row="1" > 
     <DataGrid.Columns> 
      <DataGridTextColumn x:Name="colCandidateID" Binding="{Binding CandidateID}" Header="SlNo" MinWidth="20" IsReadOnly="True" /> 
      <DataGridTextColumn x:Name="colRegistraion" Binding="{Binding RegisterNo}" Header="Reg. No." IsReadOnly="True" /> 
      <DataGridTextColumn x:Name="colCandidate" Binding="{Binding CandidateName}" Header="Name" MinWidth="250" IsReadOnly="True" /> 

      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.Header> 
        <CheckBox Name="chkSelectAll" Checked="chkSelectAll_Checked" Unchecked="chkSelectAll_Unchecked"></CheckBox> 
       </DataGridTemplateColumn.Header> 
       <DataGridTemplateColumn.CellTemplate > 
        <DataTemplate > 
         <CheckBox x:Name="colchkSelect1" Checked="colchkSelect1_Checked" Unchecked="colchkSelect1_Unchecked" ></CheckBox> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

     </DataGrid.Columns> 

    </DataGrid> 

答えて

5

を見ることができることを望む:

public class Candidate : DependencyObject 
{ 
    //CandidateID Dependency Property 
    public int CandidateID 
    { 
     get { return (int)GetValue(CandidateIDProperty); } 
     set { SetValue(CandidateIDProperty, value); } 
    } 
    public static readonly DependencyProperty CandidateIDProperty = 
     DependencyProperty.Register("CandidateID", typeof(int), typeof(Candidate), new UIPropertyMetadata(0)); 
    //RegisterNo Dependency Property 
    public int RegisterNo 
    { 
     get { return (int)GetValue(RegisterNoProperty); } 
     set { SetValue(RegisterNoProperty, value); } 
    } 
    public static readonly DependencyProperty RegisterNoProperty = 
     DependencyProperty.Register("RegisterNo", typeof(int), typeof(Candidate), new UIPropertyMetadata(0)); 
    //CandidateName Dependency Property 
    public string CandidateName 
    { 
     get { return (string)GetValue(CandidateNameProperty); } 
     set { SetValue(CandidateNameProperty, value); } 
    } 
    public static readonly DependencyProperty CandidateNameProperty = 
     DependencyProperty.Register("CandidateName", typeof(string), typeof(Candidate), new UIPropertyMetadata("")); 
    //BooleanFlag Dependency Property 
    public bool BooleanFlag 
    { 
     get { return (bool)GetValue(BooleanFlagProperty); } 
     set { SetValue(BooleanFlagProperty, value); } 
    } 
    public static readonly DependencyProperty BooleanFlagProperty = 
     DependencyProperty.Register("BooleanFlag", typeof(bool), typeof(Candidate), new UIPropertyMetadata(false)); 
} 

in MainWindow.xaml:

MainWindow.xaml.cs中
<DataGrid ItemsSource="{Binding CandidateList}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Id" Binding="{Binding CandidateID}"/> 
     <DataGridTextColumn Header="RegNr" Binding="{Binding RegisterNo}"/> 
     <DataGridTextColumn Header="Name" Binding="{Binding CandidateName}"/> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.Header> 
       <CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Checked"></CheckBox> 
      </DataGridTemplateColumn.Header> 
      <DataGridTemplateColumn.CellTemplate > 
       <DataTemplate> 
        <CheckBox IsChecked="{Binding BooleanFlag}"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

public MainWindow() 
    { 
     DataContext = this; 
     CandidateList.Add(new Candidate() 
     { 
      CandidateID = 1, 
      CandidateName = "Jack", 
      RegisterNo = 123, 
      BooleanFlag = true 
     }); 
     CandidateList.Add(new Candidate() 
     { 
      CandidateID = 2, 
      CandidateName = "Jim", 
      RegisterNo = 234, 
      BooleanFlag = false 
     }); 
     InitializeComponent(); 
    } 
    //List Observable Collection 
    private ObservableCollection<Candidate> _candidateList = new ObservableCollection<Candidate>(); 
    public ObservableCollection<Candidate> CandidateList { get { return _candidateList; } } 
    private void CheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
     foreach (var item in CandidateList) 
     { 
      item.BooleanFlag = true; 
     } 
    } 
    private void UnheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
     foreach (var item in CandidateList) 
     { 
      item.BooleanFlag = false; 
     } 
    } 
+0

与えるエラーMyDataGridSourceListが存在しません....コメントをdownvoteしてください。.. –

+0

それがDataGridのソースになるはずです。 (ObservableCollectionとして定義されている場合はより良い)MyBooleanPropertyは、DependencyObjectから継承するMyItemType内で定義されたDependencyPropertyである必要があります。あまりにも混乱している場合は、より詳細な回答を投稿するように私に教えてください – Bijan

+0

ありがとう.. 実際に私はこれに新しいですので、これらは少し混乱していますので、このことをもっと説明してください... –

2

あなたがして、データグリッド 内のすべてのチェックボックスを選択する意味場合

私は言っている:単にあなたのitemssourceコレクションをチェック/チェックしないで更新する。

public bool SelectAll 
{ 
    get{return this._selectAll;} 
    set 
    { 
    this._selectAll = value; 
    this.MyItemsSourceCollection.ForEach(x=>x.MyRowCheckProperty=value); 
    this.OnPropertyChanged("SelectAll"); 
    } 
} 

XAML

 <DataGridTemplateColumn> 
      <DataGridTemplateColumn.Header> 
       <CheckBox isChecked="{Binding SelectAll}"></CheckBox> 
      </DataGridTemplateColumn.Header> 
      <DataGridTemplateColumn.CellTemplate > 
       <DataTemplate > 
        <CheckBox IsChecked="{Binding MyRowCheckProperty}"></CheckBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 

XAMLバインディングが正しい場合、私は知らないが、私はあなたがこのような何かにあなたの候補クラスを変換する私の意思

+0

エラーを表示そのがMyItemsSourceCollection –

+0

の定義が含まれていないそのあなたがプロパティ名 – blindmeis

+0

を使用する必要がありますサンプルはuはこれを説明してもらえてください –

3

厳密ビューについて知っているべきではないモデルを話すので、モデルチェンジは、データグリッド内のすべての行を更新しているblindmeis、によって提案された解決策、休憩MVVM /プレゼンテーションデザインパターン。 MVVMでは依存関係の流れがView - > ViewModel - > Modelであることを覚えておいてください。ビューモデル(またはコントロールコードビハインド)のコントロールを参照している場合は、パターンを効果的に破棄しています。

0

これは、人が望むよりもずっと難しいことが分かりました。

最初の問題は、データモデルとしてビューモデルを持たないため、ビューモデルを列ヘッダーにバインドできないため、ビューにバインディングを正しくルーティングするためにバインディングプロキシが必要ですモデル。

public class BindingProxy : Freezable 
{ 
    public static readonly DependencyProperty DataProperty = DependencyProperty.Register(
     "Data", 
     typeof(object), 
     typeof(BindingProxy), 
     new UIPropertyMetadata(null)); 

    public object Data 
    { 
     get { return this.GetValue(DataProperty); } 
     set { this.SetValue(DataProperty, value); } 
    } 

    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 
} 

今すぐあなたのデータグリッドのリソースに結合プロキシを作成:に結合することが必要であることを

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.HeaderTemplate> 
     <DataTemplate> 
      <CheckBox 
       Command="{Binding 
        Data.SelectAllCommand, 
        Source={StaticResource DataContextProxy}}" 
       IsChecked="{Binding 
        Data.AreAllSelected, 
        Mode=OneWay, 
        Source={StaticResource DataContextProxy}, 
        UpdateSourceTrigger=PropertyChanged}" 
       IsThreeState="True" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.HeaderTemplate> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <CheckBox 
       IsChecked="{Binding 
        Path=IsSelected, 
        UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

注:

<DataGrid.Resources> 
    <aon:BindingProxy 
     x:Key="DataContextProxy" 
     Data="{Binding}" /> 
</DataGrid.Resources> 

次いで、カラムは、次のように定義する必要がありますチェックボックスのIsChecked依存プロパティとそのCommandプロパティとIsCheckedバインディングの両方がOneWayです。 IsCheckedバインドでは、アイテムの現在の状態を表示するチェックボックスが表示され、Commandバインディングがバルク選択を実行します。あなたは両方が必要です。ビューモデルで今すぐ

public void Execute(object parameter) 
{ 
    var allSelected = this.AreAllSelected; 

    switch (allSelected) 
    { 
     case true: 
      this.AreAllSelected = false; 
      break; 
     case false: 
     case null: 
      this.AreAllSelected = true; 
      break; 
    } 
} 

最後に、あなたの行アイテムビューモデル(すなわち、物事中:

public bool? AreAllSelected 
{ 
    get 
    { 
     return this.Items.All(candidate => candidate.IsSelected) 
     ? true 
     : this.Items.All(candidate => !candidate.IsSelected) 
      ? (bool?)false 
      : null; 
    } 

    set 
    { 
     if (value != null) 
     { 
      foreach (var item in this.Items) 
      { 
       item.IsSelected = value.Value; 
      } 
     } 

     this.RaisePropertyChanged(); 
    } 
} 

そしてSelectAllCommandプロパティはExecute方法があるICommandの実装ですItems)は、IsSelectedの値が変更されるたびに、メインビューモデルでPropertyChangedを上げる必要があります。あなたはそれをどうやって行うのかはあなた次第です。

関連する問題