• 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/   
  • 相关阅读:
    vmware 网络连接
    【剑指offer】设置在最小数目的阵列
    动画语音输入和文字输入开关
    Qt 如何处理拖放应用程序参数时,中国
    C#
    dojo的TabContainer添加ContentPane假设closable,怎么不闭幕后予以销毁ContentPane
    剑指XX(游戏10)
    PHP的MySQL扩张:MySQL数据库概述
    所谓策略,我站在旁边看今天 神刻的样子O2O
    两个新事物
  • 原文地址:https://www.cnblogs.com/wj204/p/3507954.html
Copyright © 2020-2023  润新知