2012-04-13 9 views
1

enter image description hereこれは私の最初の投稿です。子アイテムの1つが未チェックの場合でも、DataGridヘッダーのチェックを外す必要があります

私が抱えている問題は、DataGrid(WPF)のチェックボックスに関連しています。 申し訳ありません私は新しいユーザーであるため、問題をよりよく理解するためにスクリーンショットを添付できませんでした。

問題:子の1つがチェックされていなくても、DataHeader Columnチェックボックスがオンになっています。 私はこの問題を解決して、子供の1人が明示的にユーザーのチェックを外されたときに、ALL(ヘッダー)が暗黙的にチェックされないようにすることを期待しています。

ありがとうございました!

Plzリンクを確認してください。私はこのようなソリューションを望んでいます。 http://www.codeproject.com/Articles/42437/Toggling-the-States-of-all-CheckBoxes-Inside-a-Dat#

+0

あなたがDataGridのあなたのXAMLを追加することはできますか?あなたの問題をよく理解していませんでした。 – Nikolay

+0

@Nikolay: <チェックボックス名= "cbxAll" コンテンツ= "{X:静的プロパティ:Resources.lblAll}" チェック= "CheckBox_Checked" オフ= "CheckBox_Unchecked"> iYadav

+0

イベントハンドラを使用している場合は、グリッドチェックボックスのCheckedハンドラでヘッダーチェックボックスをチェックするかチェックしないで手動で設定できます。または、バインディングを使用する場合は、ヘッダーチェックボックスをAllCheckedプロパティにバインドしてDataContextクラスに実装できます。 – Nikolay

答えて

1

私はviewmodelにバインドするビューがあることを納得しました。私のコードでは、このビューモデルには、gridview ItemsSourceにバインドする要素のコレクションと、列ヘッダーの状態を表すプロパティHeaderCheckedがあります。すべての要素には、IsCheckedプロパティがあります。確かにViewModelはINotifyPropertyChangedをサポートします。

これはViewModelに(DataEventsSourceだけでINotifyPropertyChangedのを実装)のコードです:コレクションの要素が変更された場合

public class MainViewModel : DataEventsSource 
{ 
    private ObservableCollection<Element> _elements = new ObservableCollection<Element> 
                  { 
                   new Element {IsChecked = false}, 
                   new Element {IsChecked = false}, 
                   new Element {IsChecked = false}, 
                   new Element {IsChecked = false} 
                  }; 

    public MainViewModel() 
    { 
     foreach (var element in _elements) 
     { 
      element.PropertyChanged += OnElementPropertyChanged; 
     } 
    } 

    private void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "IsChecked") 
     { 
      bool? headerChecked = null; 
      if (Elements.All(el => el.IsChecked)) 
      { 
       headerChecked = true; 
      } 
      if (Elements.All(el => !el.IsChecked)) 
      { 
       headerChecked = false; 
      } 

      HeaderChecked = headerChecked; 
     } 

    } 

    public ObservableCollection<Element> Elements 
    { 
     get 
     { 
      return _elements; 
     } 
     set 
     { 
      _elements = value; 
     } 
    } 

    private bool? _headerChecked = false; 
    public bool? HeaderChecked 
    { 
     get 
     { 
      return _headerChecked; 
     } 
     set 
     { 
      _headerChecked = value; 
      OnPropertyChanged("HeaderChecked"); 
     } 
    } 
} 

public class Element : DataEventsSource 
{ 
    private bool _isChecked; 
    public bool IsChecked 
    { 
     get 
     { 
      return _isChecked; 
     } 
     set 
     { 
      _isChecked = value; 
      OnPropertyChanged("IsChecked"); 
     } 
    } 
} 

ご覧のように、HeaderCheckedプロパティはOnElementPropertyChanged方法で更新されます。

これは図である。

分離コード

public partial class MainWindow 
{ 
    private readonly MainViewModel _viewModel = new MainViewModel(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = _viewModel; 
    } 

    private void CheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
     foreach (var element in _viewModel.Elements) 
     { 
      element.IsChecked = true; 
     } 
    } 

    private void CheckBox_UnChecked(object sender, RoutedEventArgs e) 
    { 
     foreach (var element in _viewModel.Elements) 
     { 
      element.IsChecked = false; 
     } 
    } 
} 

そしてXAML(それは簡単のため1列のみを含有する)からメイングリッド次:

<Grid x:Name="LayoutRoot"> 
    <DataGrid x:Name="dataGrid" CanUserAddRows="False" AutoGenerateColumns="False" ItemsSource="{Binding Elements}"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn x:Name="checkboxColumn" Binding="{Binding IsChecked, Mode=TwoWay}" IsThreeState="True" Width="50" > 
       <DataGridCheckBoxColumn.HeaderTemplate> 
        <DataTemplate x:Name="dtAllChkBx"> 
         <CheckBox Name="cbxAll" Content="Label" IsChecked="{Binding Path=DataContext.HeaderChecked, ElementName=LayoutRoot, Mode=TwoWay}" Checked="CheckBox_Checked" Unchecked="CheckBox_UnChecked"></CheckBox> 
        </DataTemplate> 
       </DataGridCheckBoxColumn.HeaderTemplate> 
      </DataGridCheckBoxColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

私はこのコードがあなたを助けてくれることを願っています。私があなたに誤解した場合は、教えてください。

+0

パブリッククラスEnglLst:ObservableCollection { public bool Check {get;セット; } } – iYadav

+0

申し訳ありませんが、私はこのコメントのポイントをキャッチしませんでした。 – scor4er

+0

この2つのイベントでは、Headerチェックボックスがチェックされている場合とチェックされていない場合に、すべてのチェックボックスをチェックするためにCellTemplateを使用しています。 しかし、Invertイベントを作るためにGridViewColumnのヘッダテンプレートのチェックボックスを取り戻すには、リストからCellTemplateのいずれかのチェックボックスをオフにして、ヘッダチェックボックスをオフにしますか? – iYadav

1
//this event is for **Checked and UnChecked** of up check box (cbxall) 
private void UpCheckbox_Checked(object sender, RoutedEventArgs e) 
{ 
    //checkBox1 = cbxall (your up checkbox) 
    if (checkBox1.IsChecked == true) 
    { 
     dataGrid1.Items.OfType<YourClass>().ToList().ForEach(x => x.IsChecked = true); 
    } 
    else 
    { 
     dataGrid1.Items.OfType<YourClass>().ToList().ForEach(x => x.IsChecked = false); 
    } 
} 

//this event is for all other check box 
//**Checked and UnChecked** of all other check box is this event 
private void OtherCheckbox_Checked(object sender, RoutedEventArgs e) 
{ 
    //checkBox1 = cbxall (your up checkbox) 
    if (dataGrid1.Items.OfType<YourClass>().All(x => x.IsChecked == true)) 
    { 
     checkBox1.IsChecked = true; 
    } 
    else if (dataGrid1.Items.OfType<YourClass>().All(x => x.IsChecked == false)) 
    { 
     checkBox1.IsChecked = false; 
    } 
    else 
    { 
     checkBox1.IsChecked = null; 
    } 
} 

...

関連する問題