zoukankan      html  css  js  c++  java
  • 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/   
  • 相关阅读:
    [置顶] Android自定义控件大全
    与机房收费系统图的初步情结
    队列用链表实现(建立,插入新元素,删除元素,读取元素,全部删除,全部读出,判断是否为空,清空)
    数据结构 练习 16-动态规划
    windows和linux在建筑python集成开发环境IDE
    圆角盒演习(1)
    tortoise svn无法识别subversion check向下代码来解决
    CSS+DIV+JQuery实际的视频汇总
    【Android开发经验】Android举UI设计经验
    程序猿什么样的角色代表了这个号码?你想过这个问题?
  • 原文地址:https://www.cnblogs.com/wj204/p/3507954.html
Copyright © 2011-2022 走看看