GridControl应用点滴之Combobox

来源:互联网 发布:电脑版解压软件 编辑:程序博客网 时间:2024/06/13 22:20

    应用过程中有需要使得单元格具备Combobox的风格。

    下面就应用方式,分两种状况说明:XAML代码和程序代码

    XAML代码

                    <dxg:GridColumn.CellTemplate>                        <DataTemplate>                            <dxe:ComboBoxEdit x:Name="PART_Editor"                                              DisplayMember="Name"                                              ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,                                                                                                   AncestorType=Window,                                                                                                   AncestorLevel=1},                                                                    Path=DataContext.Jobs}"                                              ValueMember="Job" />                        </DataTemplate>                    </dxg:GridColumn.CellTemplate>

注意:1、在使用其他编辑器时,一定要设置Name为PART_Editor;

            2、如果ItemSource要使用数据行对象自身,则一定要在属性名称前加上Data,如下

<dxe:ComboBoxEdit Name="PART_Editor" ItemsSource="{Binding Data.YourProperty}"/>
除了CellTemplate,也可以设置EditTemplate和DisplayTemplate。EditTemplate,顾名思义,就是进入编辑状态下的表现形式。其使用方式类似CellTemplate,只不过内部采用ControlTemplate。DisplateTemplate专为显示效果使用,方式同CellTemplate。这里不再重复说明。

                                            <dxg:GridColumn.EditSettings >                                                <dxe:ComboBoxEditSettings ItemsSource="{Binding DataProp}">                                                </dxe:ComboBoxEditSettings>                                            </dxg:GridColumn.EditSettings>
EditSettings效果同EditTemplate,在编辑时显现。但是与Template相比,EditSettings无法识别数据行对象,这意味着只能通过CellTemplate或EditTemplate解决。

当EditSettings和CellTemplate同时设置时,以CellTemplate为准。


    程序代码

    代码创建DataTemplate

        private void CreateComboBoxCellEditingTemplate(GridColumn column, string bindingField)        {            if (column == null || bindingField == null)            {                return;            }            DataTemplate dtDataTemplate = new DataTemplate();            FrameworkElementFactory factory = new FrameworkElementFactory(typeof(ComboBoxEdit));            factory.Name = "PART_Editor";            factory.SetValue(FrameworkElement.NameProperty, "PART_Editor");            factory.SetBinding(ComboBoxEdit.ItemsSourceProperty, new Binding("Data.YourProperty"));            dtDataTemplate.VisualTree = factory;            column.CellTemplate = dtDataTemplate;        }
注意事项:

1、必须通过FrameworkElementFactory创建界面元素;

2、必须指定名称"PART_Editor"

3、通过VisualTree设置界面元素

    代码创建EditSettings

        private void CreateComboBoxCellEditingTemplate(GridColumn column, string bindingField)        {            if (column == null || bindingField == null)            {                return;            }            ComboBoxEditSettings ces = new ComboBoxEditSettings();            ces.SetBinding(ComboBox.ItemsSourceProperty, new Binding("DataProp"));            ces.SetValue(ComboBox.StaysOpenOnEditProperty, true);            ces.SetValue(ComboBox.WidthProperty, column.Width - 10);            column.EditSettings = ces;        }
这个通用有个适用场景问题,若DataProp来源于数据行对象本身,则无法使用。