項目開發需要實現:隨着綁定的數據增加,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 //是否關閉右鍵列菜單