项目开发需要实现:随着绑定的数据增加,GridControl数据也要随着动态增加,并且始终选中最新添加的数据行(即滚动条自动下滑)。其实有好多种实现方法,网上看到的有利用ScrollIntoView的ScrollToVerticalOffset方法等等,这里提供一个简便方法
GridControl的此次的绑定数据源是DataTable,当然也可以改成其他数据源,大同小异;DataTable在viewModel里面定义,同时要定义一个表示当前DataTable行数的变量,再添加和删除数据时也要随之改变,废话不多说了,直接上代码吧,另外附加一些常用的TableView属性。
1 <dxg:GridControl ItemsSource="{Binding Data}" Grid.Row="0" AutoGenerateColumns="None" ShowBorder="False" SnapsToDevicePixels="True"> 2 <dxg:GridControl.Columns> 3 <dxg:GridColumn Header="..." FieldName="...(和DataTable的列名对应)" Width="30" HorizontalHeaderContentAlignment="Center"/> 4 </dxg:GridControl.Columns> 5 <dxg:GridControl.View> 6 <dxg:TableView AllowPerPixelScrolling="True" 7 AllowScrollAnimation="false" 8 NavigationStyle="Row" 9 RowIndicatorContentTemplate="{StaticResource rowIndicatorContentTemplate}" 10 ShowFocusedRectangle="False" 11 UseEvenRowBackground="True" 12 AllowEditing="False" 13 IndicatorWidth="50" 14 FocusedRowHandle="{Binding TotalNum, Converter={StaticResource rtc}}" 15 ShowGroupPanel="False" 16 AllowGrouping="False" 17 ShowVerticalLines="False" 18 ShowHorizontalLines="False" 19 ShowDataNavigator="False" 20 ShowIndicator="True" 21 AllowResizing="True" 22 AllowSorting="False" 23 AllowFilterEditor="True" 24 AllowColumnFiltering="True" 25 AllowMoveColumnToDropArea="False" 26 AllowScrollToFocusedRow="True" 27 AutoWidth="True" 28 IsColumnMenuEnabled="False"/> 29 </dxg:GridControl.View> 30 </dxg:GridControl>
注意一个重要的属性: FocusedRowHandle,表示当前选中行handle,下面贴出其绑定的viewModel
private DataTable Data = new DataTable(); /// <summary> /// 绑定的数据表 /// </summary> public DataTable Data { get { return Data; } set { Data = value; OnPropertyChanged(new PropertyChangedEventArgs("Data")); } } private int totalNum; /// <summary> /// 帧数总数 /// </summary> public int TotalNum { get { return totalNum; } set { totalNum = value; OnPropertyChanged(new PropertyChangedEventArgs("TotalNum")); } }
TotalNum要伴随着DataTable的行数变化,下面是Convert,当然这一步有点多余,直接在添加或者删除行时候再处理就OK了。
#region 表格数据增加时让选中最后一行从而实现滚动条自动下拉 public class RowToFocusConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { int _focusRow = (int)value; _focusRow--; return _focusRow; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } #endregion
另外再附加一段RowIndicator的ContentTemplate,即在每行之前都显示当前行号,便于查看
<DataTemplate x:Key="rowIndicatorContentTemplate"> <StackPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> <TextBlock Text="{Binding Path=RowHandle.Value}" TextAlignment="Center" Foreground="LightGray"/> </StackPanel> </DataTemplate>
下面是TableView 的常用属性:
AllowPerPixelScrolling //逐像素滚动;
AllowScrollAnimation //滚动动画,当下拉滚动条时有动画效果
NavigationStyle //选中方式是一行还是单元格
ShowIndicator //是否在每一行之前显示小方块
UseEvenRowBackground //隔行其背景颜色会有所区分
AllowScrollToFocusedRow //允许滚动到选中行
AllowResizing //允许调整尺寸
AllowSorting //允许排序
AutoWidth //允许自动调整列宽
AllowMoveColumnToDropArea //允许将一列拖到空白处进行分组
AllowGrouping //允许分组
AllowFilterEditor //允许显示过滤盘
AllowEditing //允许编辑
ShowGroupPanel//显示分组panel
ShowHorizontalLines ShowVerticalLines //显示表格中每行每列垂直和水平线
IsColumnMenuEnabled //是否关闭右键列菜单