wpf datagrid checkbox toolkit

WPF Toolkit DataGrid Checkbox Issues



(1)

Te estás encontrando con el reciclaje de contenedores de artículos. Ver http://blogs.msdn.com/b/vinsibal/archive/2008/05/14/recycling-that-item-container.aspx . WPF está reutilizando los objetos de fila a medida que se desplaza, y verá que los eventos Controlado y No verificado se disparan cuando se une a una fila diferente.

Si desea seguir con su solución actual, puede simplemente desactivar el reciclaje de contenedores de elementos agregando VirtualizingStackPanel.VirtualizationMode="Standard" a su elemento dtgrd:DataGrid . También puede deshabilitar la virtualización por completo agregando VirtualizingStackPanel.IsVirtualizing="False" .

Un mejor diseño podría ser obtener esos datos de su modelo de datos subyacente en lugar de confiar en los eventos de UI. Intente manejar el evento DataTable.ColumnChanged en DataTable.

Realmente espero que alguien pueda ayudarme aquí. Tengo un DataGrid en mi programa que tiene una columna de casilla de verificación. ItemsSource para DataGrid es un DataSet cargado programáticamente. Cuando selecciono un par de elementos en DataGrid y luego lo desplazo, obtengo un comportamiento muy extraño. Por ejemplo, cuando verifico dos de los cuadros de verificación, me dice que tengo "2 seleccionados", pero luego si me desplazo hacia arriba o hacia abajo en el DataGrid, el número cambia. Si me desplazo hacia atrás a la posición inicial, vuelve a "2 seleccionados". Por extraño que parezca, parece que está llamando a los eventos de Checked / Unchecked cuando me desplazo por el cuadro ... muy extraño ...

Tengo lo siguiente definido en la parte superior de mi código:

private DataSet MyDataSet; int selected_count = 0;

Luego tengo el siguiente código en mi método para cargar la información en el DataSet:

MyDataSet = new DataSet(); DataTable tempDataTable = new DataTable(); MyDataSet.Tables.Add(tempDataTable); DataColumn tempCol = new DataColumn("Checked", typeof(bool)); tempDataTable.Columns.Add(tempCol); for (int i = 0; i < 50; i++) { DataRow tempRow = tempDataTable.NewRow(); tempDataTable.Rows.Add(tempRow); tempRow["Checked"] = false; } MyList.ItemsSource = MyDataSet.Tables[0].DefaultView;

Tengo la propiedad IsChecked enlazada a DataColumn llamada "Checked" utilizando el siguiente XAML:

<dtgrd:DataGrid x:Name="MyList" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" HeadersVisibility="Column" SelectionUnit="FullRow" HorizontalGridLinesBrush="#FF688CAF" VerticalGridLinesBrush="#FF688CAF"> <dtgrd:DataGrid.Columns> <dtgrd:DataGridTemplateColumn x:Name="CheckCol" CanUserSort="True" CanUserResize="False"> <dtgrd:DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox Name="MyCheckBox" IsChecked="{Binding Checked}" HorizontalAlignment="Center" VerticalAlignment="Center" Checked="MyCheckBox_Checked" Unchecked="MyCheckBox_Unchecked" /> </DataTemplate> </dtgrd:DataGridTemplateColumn.CellTemplate> </dtgrd:DataGridTemplateColumn> </dtgrd:DataGrid.Columns> </dtgrd:DataGrid>

Luego, tengo los siguientes eventos que se llaman marcando / desmarcando una de las casillas de verificación:

private void MyCheckBox_Checked(object sender, RoutedEventArgs e) { selected_count++; TxtSelectedCount.Text = "" + selected_count + " selected"; } private void MyCheckBox_Unchecked(object sender, RoutedEventArgs e) { selected_count--; TxtSelectedCount.Text = "" + selected_count + " selected"; }

También he intentado con otras cosas, pero consigo diferentes errores. Por ejemplo, eliminé el enlace del código XAML e intenté configurarlo programáticamente usando los siguientes eventos marcados / no seleccionados:

private void MyCheckBox_Checked(object sender, RoutedEventArgs e) { DataRow tempRow = MyDataSet.Tables[0].Rows[MyList.Items.IndexOf(MyList.SelectedItems[0])]; tempRow["Checked"] = true; selected_count++; TxtSelectedCount.Text = "" + selected_count + " selected"; } private void MyCheckBox_Unchecked(object sender, RoutedEventArgs e) { DataRow tempRow = MyDataSet.Tables[0].Rows[MyList.Items.IndexOf(MyList.SelectedItems[0])]; tempRow["Checked"] = false; selected_count--; TxtSelectedCount.Text = "" + selected_count + " selected"; }

Cuando uso ese código, el número de elementos marcados permanece igual, pero los controles reales se mueven a diferentes elementos mientras estoy desplazándome.

Honestamente no tengo ni idea de lo que está pasando, ¡pero es muy frustrante! ¡Cualquier ayuda sería GRANMENTE apreciada!