dx wpf的各种坑
这篇随笔总结dx wpf使用中的各种坑,持续更新~
LookUpEdit里内嵌的DXGrid的名字必须是“PART_GridControl”,不能不写、也不能写错。我对比了2个小时,从ViewModel到MergedResources,真没往这个方向想。当然,后来查出LookUpEdit的Document里粗体标出了这句话:Note: the embedded DXGrid name must be set to PART_GridControl.汗!咋就忘了先查一下他们家的文档呢。下次用某个控件之前,一定要先大致把文档扫一下。唉,不过很多时候,先扫文档也有点浪费时间。但出了问题,确实应该第一时间扫一下。
关于泛型控件的继承问题,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的各种坑的更多相关文章
- WPF 自定义控件的坑(蠢的:自定义控件内容不显示)
原文:WPF 自定义控件的坑(蠢的:自定义控件内容不显示) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/koloumi/article/detai ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- WPF中TimeSpan的坑
记一次在WPF中,在将格式为“DD.HH:mm:ss”字符串转换成TimeSpan时遇到的坑 如果字符串为:DD.HH:mm:ss,转换结果正确.例如: var currentValue = &quo ...
- 我遇到的WPF的坑
转自 林德熙Blog 本文:我遇到的WPF的坑 目录 单例应用在多实例用户无法使用 标记方法被使用 当鼠标滑过一个被禁用的元素时,让ToolTip 显示 获取设备屏幕数量 获取当前域用户 绑定资源文件 ...
- WPF 控件事件的一个小坑…
最近想判断一下 Slider 是由鼠标点击而改变值,还是由程序内部代码改变的值,发现鼠标的各种事件比如 MouseDown.MouseUp.MouseLeftButtonDown 什么的,都没有任何反 ...
- WPF之坑——surface触控失灵之谜
本次又遇到了WPF编写触控程序的一个问题,虽然已解决,但原因确搞不太明白,希望有大神看到这篇文章帮我解答. 在项目中实现了自己定义的icommandsource,因为需要对触控有特殊需求,控件对鼠标与 ...
- WPF之坑——ICommandSource与RoutedUICommand
最近在项目中自己写了一个控件A,继承自contentcontrol,实现了icommandsource接口.(因需求特殊并没有使用buttonbase及它的派生类为基类),控件A在测试程序中运转良好, ...
- WPF中嵌入Skyline提供的COM组件填坑
网上有很多关于在WPF中使用的Skyline提供的COM组件的教程,但大都雷同一律,其中很多的细节均为涉及,本文意在在其原基础上进行一些细节的补充. 工具:Visual Studio 2017 1. ...
- 坑死我啊,一个WPF Adorner使用注意事项
1.见鬼了? 项目中遇到这样的要求,一个Button用一个Adorner装饰,这个Adorner上又有一个Button,如下面这样 此时,我们在点击小Button的时候只希望处理小Button的事件, ...
随机推荐
- 2年后的Delphi XE6
1.有幸下载到Delphi XE6,下载地址如下: http://altd.embarcadero.com/download/radstudio/xe6/delphicbuilder_xe6_win. ...
- Android开发面试经——2.常见Android基础笔试题
标签: androidAndroid基础Android面试题Android笔试题 2015-03-12 15:04 3361人阅读 评论(3) 收藏 举报 分类: Android开发(29) 版 ...
- Struts2的Action中如何操作作用域对象
得到作用域对象有三种方法,这里用代码来解释: package com.cy.action; import javax.servlet.ServletContext; import javax.serv ...
- map each 工具函数
工具函数 即全局性的函数作用主要是提供比如字符串,数组,对象等方面的遍历 字符串工具 $.trim(str) 去除字符串两边的空格 遍历机制 map函数(function (obj,index){ ...
- 在centos6.5中安装reids
一.简介 Redis是一个key-value存储系统,是一个内存数据库,Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作 ...
- hdu 2570
贪心的经典题型 该死的精度问题,WA了好几次,以后能用乘的绝不用除!! #include<iostream> #include<algorithm> #include<c ...
- php 变量原理
1.php作为一种弱类型语言,不需要显式的指明变量的类型,但是php变量也是有类型的,php变量包含以下8种变量(三大类) a.标量类型:boolean,integer,float(double),s ...
- hibernate的懒加载问题
产生原因: 当使用hibernate查询一个对象的时候,如果Session关闭,再调用该对象关联的集合或者对象的时候,会产生懒加载异常! 解决方案: 方案一: 在Session关闭之前,查询对象关联的 ...
- Android 反编译工具简介
Android 反编译工具: 所需工具:1 apktool : 用于获取资源文件 2 dex2Jar : 用于将classes.dex转化成jar文件 2 jd-gui: 将jar文件转化成java文 ...
- Valid Palindrome [LeetCode]
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...