葡京网站spj3355并且模板没有必要绑定数据源

葡京网站spj3355 3

说明

自家在品种中依据供给须要用到WPF Dev
CellTemplateSelector时,遭遇不菲坑。曾风华正茂度想要吐弃使用模板调换器,但又心有不甘,终于在无时无刻努力下,达到了要求的渴求。所以写下去和大家大饱眼福。假若有雷同纠结的人,能够少走些弯路。小编第三次写博客,文笔不佳,还请见谅。

需求

葡京网站spj3355 1

 

须要很粗大略,采纳形式下拉框选中时间决定方法依然价格调控方式,前面包车型地铁调控点单元格对应展现日期控件或文本控件。

思路

刚得到那么些供给,就悟出了模版接纳器。不过在此以前也尚无用过模板转变器,所以走了繁多弯路。大家先看dev官方文书档案的印证

When using CellTemplate (or DataViewBase.CellTemplate) note the following:

To enable data editing, use an editor shipped with the DevExpress Data Editors Library for WPF. The editor's Name must be set to 'PART_Editor'.

When the editor's Name is set to PART_Editor, the grid automatically adjusts its appearance and synchronizes the editor with a source field specified by the FieldName or Binding properties.

Standard controls can be used in CellTemplate only for display purposes. Data editing is not allowed.

Templates specified via the DisplayTemplate and/or EditTemplate are ignored.

A column's in-place editor specified via EditSettings, is also ignored.

意思乃是模板控件必需命名称为“PART_Editor”,何况模板无需绑定数据源,对应的GridControl的列绑定数据源就能够,GridControl会自行将模板嵌入体现。笔者刚开放正是从未命名标准,而且在模板控件中绑定了数量源所以呈现一向非常。依据必要写出模板如下。

  <Window.Resources>
        <DataTemplate x:Key="FirstTemplate">
            <StackPanel>
                <dxe:DateEdit x:Name="PART_Editor"  Mask="yyyy-MM-dd" MaskUseAsDisplayFormat="True">
                </dxe:DateEdit>
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="SecondTemplate">
            <StackPanel>
                <dxe:TextEdit x:Name="PART_Editor"
                              MaskType="Numeric" Mask="n" MaskUseAsDisplayFormat="True" AllowNullInput="False" >
                </dxe:TextEdit>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

与此同有的时候间CellTemplateSelector需求继续DataTemplateSelector类,並且实现SelectTemplate方法依照条件再次来到五个您所需的Template.代码如下

 public  class SettingDataTemplateSelector: DataTemplateSelector
    {
        public DataTemplate FirstTemplate
        {
            get;
            set;
        }
        public DataTemplate SecondTemplate
        {
            get;
            set;
        }


        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            FrameworkElement element = container as FrameworkElement;

            EditGridCellData data = (EditGridCellData)item;
            Setting setting = data.RowData.Row as Setting;
            if (setting != null)
            {

                if (setting.ControlMode == 1)
                    return element.FindResource("FirstTemplate") as DataTemplate;
                else
                    return element.FindResource("SecondTemplate") as DataTemplate;
            }
            return base.SelectTemplate(item, container);
        }
    }

然后前台xmal的CellTemplateSelector中援用接收器,代码如下

      <dxg:GridColumn x:Name="ControlPointDataTime" Binding="{Binding Path=ControlPoint,Mode=TwoWay}" Header="控制点" >
                    <dxg:GridColumn.CellTemplateSelector>
                        <local:SettingDataTemplateSelector
                                                             FirstTemplate="{StaticResource FirstTemplate}"
                                                             SecondTemplate="{StaticResource SecondTemplate}" />
                    </dxg:GridColumn.CellTemplateSelector>

                </dxg:GridColumn>

中央的要求就到位了,是还是不是看着很粗大略。其实当你认为轻松是因为您打探了DEV的部分体制,比如模板控件的命名必需是“PART_Editor”,还应该有绑定的地点,任何多少个地点出错了前台运营显示都以不会万事亨通的,这时候你就能够找不到消除的不二诀要,进而达不到您想要的指标。下面的要求实际上还应该有叁个主题素材,譬喻:当您增添一条记下是金额调节的,当时那条记下已经增加到数据中了。假设您在分界面上矫正将下拉框选中改为时间决定,后边一列由于因为不可能转移为时间格式,所以呈现依然有标题。那时候咋做呢,作者想到了GridControl的CellValueChanged事件,当自家切换调控格局时,前面一列作者给它清空,那样直接让客商输入不就好了。在那地本身也将代码贴出来。

   private void ViewSimulate_CellValueChanged(object sender, CellValueChangedEventArgs e)
        {
            if (e.Column == ComControlMode)
            {
                ((GridControl) e.Source.DataControl).SetCellValue(e.RowHandle,ControlPointDataTime,null);
            }
        }

到此,项目运作起来瞧着还不错,即使须要一点也不细略,但也折腾了自己意气风发段时间,未来笔者会不断的写博客来记录本人凌驾的坑来和大家享受,同一时候也方便笔者本身查看。最终,小编将完全的demo上传供大家参考,我用的dev的本子是15.2.4,假使你的版本和自家的不相像,能够将demo中的引用删除换来本人的就足以了。

补充:当系统时间设置如下时,前台分界面将显示混乱。

葡京网站spj3355 2

前台显示如下

葡京网站spj3355 3

当本身发觉那几个主题素材,作者时期未曾更加好的消亡办法。前台模板DateEdit的Mask、DisplayFormatString以致MaskUseAsDisplayFormat都设为True。于是小编向DevSupport寻求协理。DevSupport给出解释如下:

The cause of the issue is that date values are stored as string values. In this scenario, DXGrid posts the values in the current culture to maintain end-user input. 
DateEdit editors, however, use an invariant culture to parse string values.
To resolve this issue, you can either store the date values as DateTime or additionally convert posted values. With your current implementation,
the second approach can be implemented by setting Binding.Converter to a custom converter

在这里,笔者付出第三种方法的落成情势。

public class ConvertDateTime : MarkupExtension, IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            DateTime date;
            if (value is string && DateTime.TryParse((string)value, out date))
                return date.ToString(CultureInfo.InvariantCulture);
            return value;
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return this;
        }
    }

前台加多Convert转变绑定

<dxg:GridColumn x:Name="ControlPointDataTime" Binding="{Binding Path=ControlPoint,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnSourceUpdated=True,Converter={local:ConvertDateTime}}" Header="控制点" >

到此,难题就一举成功了。

补充2:对于地点的切换调节措施时,前边一列清空的供给这里有更简短的贯彻方式,只须要将您自定义的类中的属性加上部分逻辑调控就好了,代码如下:

   private int _ControlMode;

        public int ControlMode
        {
            get { return _ControlMode; }
            set { _ControlMode = value;
                ControlPoint = null;
            }
        }

 将改善后的源码重新上传。

 源码下载: