如何正确地用代码设置ListBox的当前选中项
推荐于2016-04-12
展开全部
一开始使用的是PreviewMouseDown解决,在MouseDown的时候,通过DataContext也好,通过FindAncestor也好,反正是在获得焦点的同时选择上了。
但是随着项目的进行,这种方法造成DataBinding的Validation出现了问题。Validation应该是在LostFocus是对DataContext进行验证;但是使用PreviewMouseDown更改选中项,这个LostFocus就是在别的项被选中之后发现,结果就是用一个无关的数据在新的DataContext上进行验证。
这个问题又普遍存在于项目各个DataBinding中,分别修改肯定是不行的。只能是不用PreviewMouseDown。用GotFocus,用它的Item的GotFocus来设置选中项
为了在现有系统中方便应用,使用了AttachedProperty来实现这个功能。代码如下:
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
namespace SelectListBoxItem
{
/// <summary>
///
/// </summary>
public class ListBoxService
{
AutoSelect Property
private static void OnAutoSelectPropertyChanged(DependencyObject element, DependencyPropertyChangedEventArgs e)
{
if (!(element is UIElement))
return;
if ((bool)e.NewValue)
(element as UIElement).GotFocus += new RoutedEventHandler(OnElementGotFocus);
else
(element as UIElement).GotFocus -= new RoutedEventHandler(OnElementGotFocus);
}
private static void OnElementGotFocus(object sender, RoutedEventArgs e)
{
Debug.Assert(e.OriginalSource is DependencyObject);
ListBoxItem item = (e.OriginalSource as DependencyObject).FindAncestor<ListBoxItem>();
if (item != null)
item.IsSelected = true;
else
Debug.WriteLine(string.Format("Cannot find ListBoxItem from {0}", sender));
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询