如何正确地用代码设置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));
        }
   }
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式