这篇随笔总结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. PHPStorm怎么修改选中的背景颜色呢?

    File -> Settings -> editor ->color&fonts->general->下拉框中的selection background-> ...

  2. 【Todo】Python面试题分析记录(修饰器等)

    首先,看这一段代码: class A(object): x = 1 gen = (lambda t: (t for _ in xrange(10)))(x) if __name__ == '__mai ...

  3. Android 图片Exif信息相关的获取与修改

    1 Exif是什么 Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.ISO.焦距.日期时间 ...

  4. hdu 4965 Fast Matrix Calculation

    题目链接:hdu 4965,题目大意:给你一个 n*k 的矩阵 A 和一个 k*n 的矩阵 B,定义矩阵 C= A*B,然后矩阵 M= C^(n*n),矩阵中一切元素皆 mod 6,最后求出 M 中所 ...

  5. Android 热补丁动态修复框架小结

    一.概述 最新github上开源了很多热补丁动态修复框架,大致有: https://github.com/dodola/HotFix https://github.com/jasonross/Nuwa ...

  6. Android事件传递机制(转)

    Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...

  7. hdu_3555 bomb

    数位动态规划     数位动态规划是求解一个大区间[L, R]中间满足条件Q的所有数字的个数(或者和,或其他)的一种方法.它通过分析每一位上的数字,一般用 dp[len][digit][...] 来表 ...

  8. 检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统

    /** * Author: laixiangran. * Created by laixiangran on 2015/12/02. * 检测访问网页的浏览器呈现引擎.平台.Windows操作系统.移 ...

  9. 第二章 Python基本元素:数字、字符串和变量

    Python有哪些内置的数据类型: True False #布尔型 42 100000000 #整型 3.14159 1.0e8 #浮点型 abcdes #字符串 2.1 变量.名字和对象 pytho ...

  10. 详解DHV:怎么具体展示高价值

    我的理解里面:高价值分两个部分,一个是静态的,一个是动态的. 我把静态的称为硬性指标,动态的称为软性指标. 下面我给大家仔细解释一下两个指标的具体展示. ----------------------- ...