这篇随笔总结dx wpf使用中的各种坑,持续更新~

  1. LookUpEdit里内嵌的DXGrid的名字必须是“PART_GridControl”,不能不写、也不能写错。我对比了2个小时,从ViewModel到MergedResources,真没往这个方向想。当然,后来查出LookUpEdit的Document里粗体标出了这句话:Note: the embedded DXGrid name must be set to PART_GridControl.汗!咋就忘了先查一下他们家的文档呢。下次用某个控件之前,一定要先大致把文档扫一下。唉,不过很多时候,先扫文档也有点浪费时间。但出了问题,确实应该第一时间扫一下。

  2. 关于泛型控件的继承问题,1)控件的基类不能带有xaml,如果想要带上控件,只能用代码生成咯;2)泛型控件的声明如下,注意要带上x:TypeArguments才行,否则泛型类声明不完整,编译出错;3)另外由于WindowBase并没有Resources,因此要在基类里找。

//cs部分
public partial class Window1 : WindowBase<Window1ViewModel>
//xaml部分
<my:WindowBase x:Class="Window1" x:TypeArguments="vm:Window1ViewModel"
xmlns:my="clr-namespace:TestWpf.Base"
xmlns:vm="clr-namespace:TestWpf.ViewModel">
<Window.Resources>

3.关于SpinEdit,如果把值绑定到SpinEdit.EditValue,再添加Validate事件,很容易出现明明是正确的值,却显示验证错误:未能转换值 "0"的提示。绑定到SpinEdit.Value(这是decimal的)或者SpinEdit.Text(这是string的)都OK。猜测是Dx里自带了StringToDoubleConverter+DecimalToDoubleConverter之类的,却没有ObjectToDouble的Converter,唉,找了半天!例子在此

4.关于FilterString里的Between,第一次绑定时有效,以后就无法绑定过滤了。然后给DevExpress发了邮件例子在此 这里要赞一下DevExpress的SupportTeam,当天就给了回复,原因当然是自己2B了,因为FilterString默认是单向绑定的,这也算是WPF里面常见的问题了,可惜自己以前没踩进来,印象不深。

另外:Between的Format应该是:[FieldName] Between({0}, {1}),注意不要加单引号,不能写成这样:Between('{0}', '{1}')。我当时看到Dx显示出来是带单引号的,所以我按照单引号拼接FilterString,无效,汗!

5.接着4.说一下WPF里的BindingMode和UpdateSourceTrigger。这2个属性的Default值都是因控件而异的,这个设定有点贱!具体某个控件的默认值是OneWay|TwoWay、还是PropertyChanged|LostFocus,全由控件自己在.cctor()里定义。因为控件的DP实在太多了,没有完整的列表。当然也有一个通用的准则:能够与用户交互的属性一般是双向绑定;不能与用户交互的一般是单向绑定。前者,比如TextBox.TextProperty和CheckBox.IsCheckedProperty;后者,比如我踩的这个坑:GridControl.FilterStringProperty。有2种方式可以知道某个属性的默认值到底是什么:

1)用如下代码:

var meta = DataControlBase.FilterStringProperty.GetMetadata(typeof(GridControl)) as FrameworkPropertyMetadata;
if(null != meta) return;
Console.WriteLine(meta.BindsTwoWayByDefault);
Console.WriteLine(meta.DefaultUpdateSourceTrigger);

这里有一个继承关系:FrameworkPropertyMetadata->UIPropertyMetadata->PropertyMetadata。大部分DP的元数据都只是PropertyMetadata,那自然也就没有BindsTwoWayByDefault属性,这种情况下,默认是OneWay(Why? 我没找到源码,呵呵)。UpdateSourceTrigger相对简单,默认都是PropertyChanged,目前只知道TextBox是默认LostFocus的,其他慢慢再积累吧。

2)直接用ILSpy或者Reflector去源码里找,又快又方便。在各个控件的.cctor()里找到如下的代码,一目了然:

TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(TextBox),
new FrameworkPropertyMetadata(string.Empty,
FrameworkPropertyMetadataOptions.Journal |
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
new PropertyChangedCallback(TextBox.OnTextPropertyChanged),
new CoerceValueCallback(TextBox.CoerceText),
true,
UpdateSourceTrigger.LostFocus));

但也有个小问题,不管哪个工具,居然都解析不出PresentationFramework里的源码,这是啥原因?知道的同学请指教!

3)最后小结是:为保险起见,不妨总是显示设置Mode=TwoWay,一旦忘了,找起来要多花很多时间哦。

6.Dx的Grid里的VisibleIndex的行为有点怪,刚开始可能会有些疑惑。反复尝试,发现关键是在前后加上Begin/EndUpdate(),代码如下:

grid.Columns.BeginUpdate();
foreach(var item in grid.Columns) {
if(list.Contains(item.FieldName)) item.Visible = true;
else item.Visible = false;
}
for(int i=0;i<list.Count;i++){
grid.Columns[list[i]].VisibleIndex = i;
}
grid.Columns.EndUpdate();

7.1)Dx的Chart里有数据聚合的概念,为的是把大量的数据聚合成离散的点,便于清晰显示,详细见[这里]。用ContinuousDateTimeScaleOptions会导致Bar类型不显示,改用Automatic或Manual可以。2)BarSeries2D.BarWidth表示基于刻度的比例,而不是像素。详情见[这里]。3)AxisLabel.TextPattern是Dx自定的StringFormat,除了C#里常规的F1、N3、P2之类的,还包括自定的关键字,比如{A}:Argument、{V}:Value等,详情见[这里]。4)设置EnableAnimation=True(注意这个属性在设计器里不可见)或AnimationMode=OnLoad,可以启用动画功能。但如果设置AnimationAutoStartMode=SetStartState的话,会导致Chart不显示,Dx的文档里提到了这点,但深层原因不明,详情见[这里]。另1个枚举值SetFinalState会导致动画无效。设置PlayOnce或者干脆不设置都OK。但奇怪的是,Dx提供的例子ChartsDemo->PanesControl里却可以,呵呵。5)Dx的WPF目前尚不支持ScaleBreaks,WinForm的版本是支持的,常见的例子是中午11:30-13:00休市期间的数据为空。这个比较无语,详情见[这里]。

dx wpf的各种坑的更多相关文章

  1. WPF 自定义控件的坑(蠢的:自定义控件内容不显示)

    原文:WPF 自定义控件的坑(蠢的:自定义控件内容不显示) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/koloumi/article/detai ...

  2. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  3. WPF中TimeSpan的坑

    记一次在WPF中,在将格式为“DD.HH:mm:ss”字符串转换成TimeSpan时遇到的坑 如果字符串为:DD.HH:mm:ss,转换结果正确.例如: var currentValue = &quo ...

  4. 我遇到的WPF的坑

    转自 林德熙Blog 本文:我遇到的WPF的坑 目录 单例应用在多实例用户无法使用 标记方法被使用 当鼠标滑过一个被禁用的元素时,让ToolTip 显示 获取设备屏幕数量 获取当前域用户 绑定资源文件 ...

  5. WPF 控件事件的一个小坑…

    最近想判断一下 Slider 是由鼠标点击而改变值,还是由程序内部代码改变的值,发现鼠标的各种事件比如 MouseDown.MouseUp.MouseLeftButtonDown 什么的,都没有任何反 ...

  6. WPF之坑——surface触控失灵之谜

    本次又遇到了WPF编写触控程序的一个问题,虽然已解决,但原因确搞不太明白,希望有大神看到这篇文章帮我解答. 在项目中实现了自己定义的icommandsource,因为需要对触控有特殊需求,控件对鼠标与 ...

  7. WPF之坑——ICommandSource与RoutedUICommand

    最近在项目中自己写了一个控件A,继承自contentcontrol,实现了icommandsource接口.(因需求特殊并没有使用buttonbase及它的派生类为基类),控件A在测试程序中运转良好, ...

  8. WPF中嵌入Skyline提供的COM组件填坑

    网上有很多关于在WPF中使用的Skyline提供的COM组件的教程,但大都雷同一律,其中很多的细节均为涉及,本文意在在其原基础上进行一些细节的补充. 工具:Visual Studio 2017 1.  ...

  9. 坑死我啊,一个WPF Adorner使用注意事项

    1.见鬼了? 项目中遇到这样的要求,一个Button用一个Adorner装饰,这个Adorner上又有一个Button,如下面这样 此时,我们在点击小Button的时候只希望处理小Button的事件, ...

随机推荐

  1. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

  2. DOM节点操作

    请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1  一.创建节 ...

  3. Boostrap学习心得

    进入新公司,前端用到各种页面元素几乎都是bootStrap框架里的,下面介绍下某些页面控件怎么运用,作为知识点备份,提供有需要人观看: 首先下载bootstrap,地址http://www.bootc ...

  4. matlab中图像显示函数

    image函数是显示图像的最基本的方法.该函数还产生了图像对象的句柄,并允许对对象的属性进行设置. imagesc函数也具有image的功能,所不同的是imagesc函数还自动将输入数据比例化,以全色 ...

  5. 串行通讯之.NET SerialPort异步写数据

    目录 第1章说明    2 1 为什么需要异步写数据?    2 2 异步写数据的代码    2 3 源代码    4 第1章说明 1 为什么需要异步写数据? 如下图所示,以波特率300打开一个串口. ...

  6. 串行通讯之Qt

    目录 第1章 Qt 串行通讯    1 1.1 配置.pro文件    1 1.2 查询串口信息    1 1.3 配置.打开串口    3 1.4 setRequestToSend在Windows上 ...

  7. addEventListener,attachEvent

    addEventListener是js填加事件:用法如下: target.addEventListener(type,listener,useCapture) target: 文档节点.documen ...

  8. [redis] 普通 RedisPool 的 CRUD 实现

    参考链接: redisTemplate 操作 Maven中Spring-Data-Redis存储对象(redisTemplate) 1.配置RedisTempate类 配置文件 <?xml ve ...

  9. python中2进制、10进制、16进制等之间的转换

    10转2: bin(8) # '0b1000' 2转10: int( 10转16: hex(15) # '0xf' 16转10: int( 2进制和16进制中间通过转10进制可以相互转换 from b ...

  10. python中的类变量、实例变量

    类变量,是各个实例共享的资源,就像中央空调,只有一个,但每个房间(实例)均可享用. 实例变量,是每个实例各自分配使用的变量,每个房间(实例)都有一台空调,供自己使用. class handle(obj ...