SilverLight 控件ListBox中的SelectionChanged事件

 出现的问题:

  ListBox 中给了它一个这样的事件SelectionChanged="NumBasket_SelectionChanged" 也就是单击某行就会触发的事件,要实现的效果是,单击此行时,此行的信息移除

 本以为写这行代码可以实现效果:

 '已经选号变动
    Private Sub NumBasket_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs)
        If NumBasket.Items.Count > 0 Then
            NumBasket.Items.RemoveAt(NumBasket.SelectedIndex)
            'NumBasket.Items.Remove(NumBasket.SelectedItem)
        End If
    End Sub

事实是,如果只有一行数据的话不会出什么问题,但是如果有两行就抛出异常了,异常为:

 问题分析:现在没找到相关的解释,只是看到这个错误提示。。。。

 解决方案:

 看到别人是这样处理的:

 delegate void DeleteSelected(object item);
        bool isSysSet = false;
        private void NumBasket_SelectionChanged(object sender, RoutedEventArgs e)
        {
            //if (NumBasket.Items.Count > 0)
            //{
            //    NumBasket.Items.Remove(NumBasket.SelectedItem);
            //}
            if (isSysSet) return;
            DeleteSelected delete = new DeleteSelected(DeleteSelectItem);
            Dispatcher.BeginInvoke(delete, NumBasket.Items[NumBasket.SelectedIndex]);
            isSysSet = false;
        }
        void DeleteSelectItem(Object item)
        {
            if (NumBasket.Items.Count > 0)
            {
                isSysSet = true;
                NumBasket.Items.Remove(item);
                isSysSet = false;
            }
        }

    查看Microsoft文档http://technet.microsoft.com/zh-cn/library/cc190259(v=vs.95).aspx
 ,对其中的一些代码 Dispatcher.BeginInvoke(delete, NumBasket.Items[NumBasket.SelectedIndex]);的解释是 在与 Dispatcher 关联的线程上异步执行指定的委托。

 从解决方案中剖析问题所在:

 发现  bool isSysSet = false; 这个变量好像没什么用,可是删除又会报错。。。。╮(╯_╰)╭

为什么感觉这个变量没用呢?我是这样肤浅的分析:

 在DeleteSelectItem()方法中

                isSysSet = true;
                NumBasket.Items.Remove(item);
                isSysSet
= false;

将变量isSysSet设置为true以后,删除改行后,又立即设置为false了,这个能起到什么作用?也就是说,我想的是 选中某行就触发此事件,而且只有这一个线程。。嗯,现在问题分析出来了

是因为  NumBasket.Items.Remove(item); 这行代码执行时,它也会调用 NumBasket_SelectionChanged()这个事件,所以现在 变量isSysSet 的作用就体现出来了。

作者:wj704    出处:http://www.cnblogs.com/wj204/   
原文地址:https://www.cnblogs.com/wj204/p/3507954.html