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的事件, ...
随机推荐
- 【Todo】Mybatis学习-偏理论
之前写过好几篇Mybatis相关的文章: http://www.cnblogs.com/charlesblc/p/5906431.html <SSM(SpringMVC+Spring+Myba ...
- hdu 4870 Rating
题目链接:hdu 4870 这题应该算是概率 dp 吧,刚开始看了好几个博客都一头雾水,总有些细节理不清楚,后来看了 hdu 4870 Rating (概率dp) 这篇博客终于有如醍醐灌顶,就好像是第 ...
- Lucene 基础理论 (zhuan)
http://www.blogjava.net/hoojo/archive/2012/09/06/387140.html**************************************** ...
- CSS三种定位机制
标准文档流 块级元素撑满整个页面div,ul,li,dl,dt,p 行级元素可以一行显示多个span,strong,img,input大部分 一般不设置盒子的高度,另其自动调整 margin属性的au ...
- PHP 实现多服务器共享 SESSION 数据
PHP 实现多服务器共享 SESSION 数据 2011 年 12 月 05 日评论暂缺 一.问题起源 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一 ...
- Machine Learning - 第3周(Logistic Regression、Regularization)
Logistic regression is a method for classifying data into discrete outcomes. For example, we might u ...
- 日期操作类--Date类
Date-API ava.util包提供了Date类来封装当前的日期和时间.Date类提供两个构造函数来实例化Date对象.第一个构造函数使用当前日期和时间来初始化对象. Date( ) 第二个构造函 ...
- Java位操作全面总结
转载: Java位操作全面总结 在计算机中所有数据都是以二进制的形式储存的.位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快.在实际编程中,如果能巧妙运用位操作,完全可以达到 ...
- Java Swing事件处理机制
Java Swing的事件处理机制 Swing GUI启动后,Java虚拟机就启动三个线程,分别为主线程,事件派发线程(也是事件处理线程)和系统工具包线程. 主线程 :负责创建并显示该程序的初始界面: ...
- js节点问题
转载 http://dwt1220.blog.51cto.com/1028523/745402 本文出自 “dwt1220” 博客,请务必保留此出处http://dwt1220.blog.51cto. ...