posts - 57,  comments - 191,  trackbacks - 21

有人可能会说这有什么好写的。不就是一行代码就能搞定的吗?而且为什么需要用代码设置SelectedItem呢?用户所点的Item不就自动是SelectedItem吗?在这里将要讨论我们的,就是ListBox自己没有能自己把SelectedItem设置正确的情况。本来想当作一个WPF Bug清单的一篇文章的,但是又感觉也许就是有这样变态的需求呢。

 

我们用一个非常简单的代码的XAML就可以重现这个问题。

 

Demo Window

 

运行的效果如下。

1. TextBox得到焦点

 其实这就是个问题,一个ListBoxItem已经被MouseDown了,可是没有被选中。MouseDown已经被TextBox吃了。结果有可能出现下面的状况。 

2. 焦点与选中项不一致 

这个问题在WPF里的其它控件也有,在智者千虑【WPF】如何让TreeView实现右键选中的功能里就描述了TreeView上的相似问题。感觉很恶心。

 

一开始使用的是PreviewMouseDown解决,在MouseDown的时候,通过DataContext也好,通过FindAncestor也好,反正是在获得焦点的同时选择上了。

 

但是随着项目的进行,这种方法造成DataBindingValidation出现了问题。Validation应该是在LostFocus是对DataContext进行验证;但是使用PreviewMouseDown更改选中项,这个LostFocus就是在别的项被选中之后发现,结果就是用一个无关的数据在新的DataContext上进行验证。

 

这个问题又普遍存在于项目各个DataBinding中,分别修改肯定是不行的。只能是不用PreviewMouseDown。用GotFocus,用它的ItemGotFocus来设置选中项。

 

为了在现有系统中方便应用,使用了AttachedProperty来实现这个功能。代码如下:

 

ListBoxService

 

其中FindAncestor是自己定义的一个方法,因为单纯地使用VisualTreeHelper是不足以在所有情况下找到Parent的。代码可参见源代码 

写好了怎么用呢?我们说了,要以对现有代码最小的变动实现这个功能。可能有人已经想到了,用Style,那个Window的代码根本不用动。只要在App.xaml里加上一个ResourceOK了。代码如下,简单吧。 

App Resource

 

到此,ListBox的行为算是正常些了。正常的运行截图就不发了。

 

 

 

posted on 2009-01-12 23:56 南柯之石 阅读(1761) 评论(6)  编辑 收藏 网摘

FeedBack:
#1楼[楼主]
2009-01-13 00:01 | 南柯之石      
就为了这一行代码。
item.IsSelected = true;
写了一陀代码。
哎……

  回复  引用  查看    
2009-01-13 08:32 | 想爱就去爱吧      
哈哈
  回复  引用  查看    
2009-01-13 13:03 | Clingingboy      
那可能是样式的问题,重新调整样式就可以了.如vista和xp下的样式性能差别是很大的,在一定的应用下,就变成bug了.调整下就好
  回复  引用  查看    
2009-01-13 21:27 | Muse      
应该与样式无关,WPF的画面绘制比较特别
  回复  引用  查看    
#5楼[楼主]
2009-01-13 21:43 | 南柯之石      
@Clingingboy
应该不是样式的问题,那个蓝色条[有时是灰色]的有无,取决于IsSelected的值。当里面有个TextBox时,IsSelected就没有机会被自动地设置为True了。

  回复  引用  查看    
#6楼[楼主]
2009-01-13 21:43 | 南柯之石      
@Muse
同意。

  回复  引用  查看    
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1374543 0CeISIA8vfk=



相关文章:

相关链接:
<2009年1月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

本人保留本博客所有文章版权,未经得本人同意的转载,必须在明显位置注明文章出处及作者,否则视为侵权。

与我联系

搜索

 

常用链接

留言簿

我的标签

随笔档案(55)

文章档案(3)

积分与排名

  • 积分 - 38584
  • 排名 - 1569

最新评论

阅读排行榜

评论排行榜

60天内阅读排行