0

DataGrid の出荷と製品があります。出荷は常に表示され、各出荷の製品は RowDetails に表示され、行をダブルクリックすると表示されます。

DataGrid では、カスタム チェックボックス列を使用しています。

<DataGridTemplateColumn>
   <DataGridTemplateColumn.Header>
       Copy
   </DataGridTemplateColumn.Header>
   <DataGridTemplateColumn.CellTemplate>
       <DataTemplate>
           <CheckBox IsChecked="{Binding Path=DoCopy, Mode=TwoWay, 
             UpdateSourceTrigger=PropertyChanged}"
       </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

<DataGrid.RowDetailsTemplate>は同じ列を持っています。私が探しているのは、「メイン」チェックボックスがチェックされているときに、詳細ビューですべての項目をチェックすることです。

Shipment クラスと Product クラスがあります。どちらのクラスにも DoCopy プロパティがあります。出荷:

Run through all products and set DoCopy = true

問題:

DataGrid のチェックボックスをクリックすると、すべての製品のチェックボックスがオンになります。ただし、RowDetails が表示されない場合のみ。RowDetails が表示され、「メイン」チェックボックスをクリックすると、チェックされますが、詳細チェックボックスはチェックされません。

また、以前に行の詳細を開いて閉じてから「メイン」チェックボックスをオンにした場合も、同じことが起こります。商品のチェックボックスはオフのままです。

出荷には、List<Product>その出荷のすべての製品を含む があります。

何か案は?

4

3 に答える 3

2

次のコードは私にとってはうまくいきます。あるイベントでデータグリッドのすべてのチェックボックスを選択したいだけです。次のコードは、データグリッド内のすべてのチェック ボックスをオンにしただけです。私の場合、列0はチェックボックス列です

private void SelectAll()
    {
        for (int i = 0; i < dgVehicle.Items.Count; i++)
        {
            DataGridRow row = (DataGridRow)dgVehicle.ItemContainerGenerator.ContainerFromIndex(i);

            if (row != null)
            {
                CheckBox chk = dgVehicle.Columns[0].GetCellContent(row) as CheckBox;
                chk.IsChecked = true;
            }
        }
    } 
于 2012-10-07T11:44:55.540 に答える
0

わかった、みんな。実装するのを忘れていたようINotifyPropertyChangedです。すべてが正常に機能します。ありがとう :-)

于 2012-06-19T07:17:38.060 に答える
0

これを処理する最も簡単な方法であるthakrageは、すべての「コピー」チェックボックス行に対してクリックイベントを使用します。そのイベントでは、Docopy = trueまたは好きなように設定できます...

次に、データグリッドの外側にチェックボックスを定義し、マージンを設定してチェックボックスをデータヘッダーとまったく同じように配置し、クリックイベントをバブルしてすべての行をチェックします。

以下の私のサンプルコードを参照してください:

<CheckBox Name="chkbox_chkall" Click="chkbox_chkall_Click" Content="Check all" BorderBrush="#FF828282" Foreground="#FF5B585A"/>

<DataGridTemplateColumn.CellTemplate>
   <DataTemplate>
       <CheckBox IsChecked="{Binding Path=DoCopy, Mode=TwoWay, 
         UpdateSourceTrigger=PropertyChanged}" Click="chkBoxRow_Click"
   </DataTemplate>

コードビハインドで:

    private void chkbox_chkall_Click(object sender, RoutedEventArgs e)
    {
        CheckBox chkbox_chkall = sender as CheckBox;
        foreach (OnlineActivatedProducts rowItem in (grdProducts.ItemsSource))
        {
            CheckBox chk = grdProducts.Columns[6].GetCellContent(rowItem) as CheckBox;
            if (chkbox_chkall.IsChecked == true)
            {
                chk.IsChecked = true;
            }
            else
            {
                chk.IsChecked = false;
            }
            chkBoxRow_Click(chk, e); // which bubbles each rows checked / unchecked event
        }
    } 

    private void chkBoxRow_Click(object sender, RoutedEventArgs e)
    {
        if (chkBoxContent.IsChecked.Value)
        {
            //if checked do something here 
        }
        else if (!chkBoxContent.IsChecked.Value)
        {
            //if unchecked do something here
        }
    }
于 2012-06-18T13:04:35.717 に答える