操作顺序:
1、手动选中 多选框,每列3个
2、滚动鼠标滚轮或下拉滚动条
3、返回查看之前选中的多选框。
问题的现象:
1、对于DataGridTemplateColumn 选中效果被丢失,剩余最后选中的行保持选中状态
2、对于DataGridCheckBoxColumn选中效果未丢失,滚动时有拖影效果
补充:
1、不使用DataGridCheckBoxColumn的原因是 DataGridCheckBoxColumn列需要单击2次才能选中
2、DataGridTemplateColumn 选中的行被隐藏会触发unchecked事件,造成选中的数据不被记录
3、如果考虑使用ScrollViewer如何保证列头不被看不到
对于DataGrid中以上2中checkbox的使用,不知是否有更优方案,希望得到各位高手的指点。
xaml代码:
<Grid Margin="0,0,45,17"> <Grid.RowDefinitions> <RowDefinition Height="auto" ></RowDefinition> </Grid.RowDefinitions> <DataGrid Width="400" Height="400" AutoGenerateColumns="False" Name="dg" Grid.RowSpan="1" VerticalScrollBarVisibility="Auto" MouseWheel="dg_MouseWheel"> <DataGrid.Columns> <DataGridCheckBoxColumn Binding="{Binding 1}" Width="auto" Header="DataGridCheckBoxColumn" > </DataGridCheckBoxColumn> <DataGridTemplateColumn Width="auto"> <DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <TextBlock>DataGridTemplateColumn</TextBlock> </DataTemplate> </DataGridTemplateColumn.HeaderTemplate> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding 2}" Unchecked="CheckBox_Unchecked_1" Checked="CheckBox_Checked_1"></CheckBox> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </Grid>
cs代码
public Window1() { InitializeComponent(); DataTable dt = new DataTable(); dt.Columns.Add("1", typeof(Boolean)); dt.Columns.Add("2", typeof(Boolean)); for (int i = 0; i < 200; i++) { DataRow dr= dt.NewRow(); dr[0] = false; dr[1] = false; dt.Rows.Add(dr); } dg.ItemsSource = dt.DefaultView; }
你说的那个
1对于DataGridTemplateColumn 选中效果被丢失,剩余最后选中的行保持选中状态
解决:我想了一下改一下数据源就行了
把checkbox的事件改成Click
这是前端UI代码
<Window x:Class="WpfApplication2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid Margin="0,0,45,17"> <Grid.RowDefinitions> <RowDefinition Height="auto" ></RowDefinition> </Grid.RowDefinitions> <DataGrid Width="400" Height="400" AutoGenerateColumns="False" Name="dg" Grid.RowSpan="1" VerticalScrollBarVisibility="Auto" > <DataGrid.Columns> <DataGridCheckBoxColumn Binding="{Binding 1}" Width="auto" Header="DataGridCheckBoxColumn" > </DataGridCheckBoxColumn> <DataGridTemplateColumn Width="auto"> <DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <TextBlock>DataGridTemplateColumn</TextBlock> </DataTemplate> </DataGridTemplateColumn.HeaderTemplate> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding 2, Mode=TwoWay}" Click="CheckBox_Click" ></CheckBox> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </Grid> </Window>
这是后台代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Data; namespace WpfApplication2 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { DataTable dt = new DataTable(); private bool isWheel = false; public MainWindow() { InitializeComponent(); dt.Columns.Add("1", typeof(Boolean)); dt.Columns.Add("2", typeof(Boolean)); for (int i = 0; i < 200; i++) { DataRow _dr = dt.NewRow(); _dr[0] = false; _dr[1] = false; if (i == 5 || i == 28 || i == 38) { _dr[0] = true; _dr[1] = true; } dt.Rows.Add(_dr); } dg.ItemsSource = dt.DefaultView; } public void ChangeDataBase(CheckBox f_CheckBox) { DataRowView _drv = (DataRowView)dg.SelectedItem; if (_drv != null ) dt.Rows[dg.SelectedIndex][1]=f_CheckBox.IsChecked; } private void dg_ScrollChanged(object sender, ScrollChangedEventArgs e) { } private void CheckBox_Click(object sender, RoutedEventArgs e) { ChangeDataBase((CheckBox)sender); } } }
这个是给出的最好答复,其实后台不须手动修改数据源,只需要改为双向绑定即可自动修改数据源
@_刘宏伟_:
好的我也学习一下去看看
楼上说的有理