(持续更新)Xamarin.Forms之DevExpress GridControl的使用技巧

1.当使用ItemsSource绑定的对象为ObservableCollection<T>的时候,发现当改变Item的Property的时候,相应的Row并没有刷新

官方有一个IBingList接口,ItemsSource实现该接口即可,也有DevExpress官方已实现好的BindingList<T>,与ObservableCollection<T>的作用一样,可以直接替换

2.长按GridControl的时候会弹出PopupMenu,怎么完全禁用它?

GridControl.IsColumnMenuEnabled,

GridControl.IsGroupRowMenuEnabled,

GridControl.IsRowCellMenuEnabled,

GridControl.IsTotalSummaryMenuEnabled

将上面的四个属性设为false

3.怎么修改PopupMenu的内容

在GridControl事件中有一个PopupMenuCustomization事件

该事件是创建菜单的时候触发的,譬如长按RowHeader

根据GridPopupMenuType来判断是哪种类型的菜单,DataRowGroupRowHeaderTotalSummary

e.Menu.Items就是全部的菜单项了,Item有一个Click事件,这就是点击该Item触发的事件了,默认的Item都有一个默认的Click事件,如果你要重写,必须先删除该事件上的委托,否则会触发两种委托

4.创建自定义Column

GridControl里面有很多定义好的Column,譬如TextColumn  ImageColumn  DateColumn  PickerColumn,但是这些都只是绑定了一个Property,如果要自定义Column,需要用到TemplateColumn

<dxg:TemplateColumn FieldName="Weather" Caption="天气" ContentAlignment="Center" IsReadOnly="true">
                        <dxg:TemplateColumn.DisplayTemplate>
                            <DataTemplate>
                                <Label Text="{Binding Value,Converter={StaticResource WeatherTypeNameConverter},Mode=OneWay}" Style="{StaticResource GridControl_TemplateColumn_LabelStyle}"/>
                            </DataTemplate>
                        </dxg:TemplateColumn.DisplayTemplate>
                    </dxg:TemplateColumn>

FiledName还是填写所需要展示的Model的PropertyName,DataTemplate里面可以通过Path=Value来获取该值

如果特殊情况下,你需要获取整个Model,用Source替换Value就可以了

<Label Text="{Binding Source,Converter={StaticResource DataObjectConverter},Mode=OneWay}" Style="{StaticResource GridControl_TemplateColumn_LabelStyle}"/>

5.如何获取到正确的SelectedDataObject

由于使用的是MVVM模式,在ViewModel中有我绑定的数据源DataList和GridControlSelectedIndex,我获取选中元素的时候是采用DataList[GridControlSelectedIndex]来获取的

这是一个错误的用法,由于GridControl的强大,本身就支持数据的排序,但是注意,排序并不会影响DataList里面的顺序,也就是说你排序的时候,GridControlSelectedIndex会发生变化(因为选中元素的位置发生了变化),但是此时的DataList没有发生变化,你这样获取的SelectedDataObject是错误的

另外获取SelectedDataObject对象也不要通过SelectionChanged事件来获取,因为该事件会在SelectedDataObject改变之前就已经触发了,也就是说你获取到的是前面的SelectedDataObject 

正确姿势:直接绑定GridControl的SelectedDataObject对象(如果关闭排序功能的话上面那种做法也是可行的)

6.BindingList

目前所知,List<T>里面的对象的属性修改必须放在主线程中执行

7.DateColumn

DataColumn绑定的元素必须是DateTime类型,不能是String类型,如果是String类型,虽然可以显示(数据为空的时候显示为空),但是在排序的时候,会出现转换失败的错误(即使该字符串可以转换成DateTime类型,v10.2.5)

原文地址:https://www.cnblogs.com/yz1311/p/5220214.html