SilverLight 控件ListBox中的SelectionChanged事件
2014-01-06 22:10
169 查看
出现的问题:
ListBox 中给了它一个这样的事件SelectionChanged="NumBasket_SelectionChanged" 也就是单击某行就会触发的事件,要实现的效果是,单击此行时,此行的信息移除
本以为写这行代码可以实现效果:
事实是,如果只有一行数据的话不会出什么问题,但是如果有两行就抛出异常了,异常为:
问题分析:现在没找到相关的解释,只是看到这个错误提示。。。。
解决方案:
看到别人是这样处理的:
查看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 的作用就体现出来了。
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 的作用就体现出来了。
相关文章推荐
- 稳扎稳打Silverlight(5) - 2.0控件之ListBox, MediaElement, MultiScaleImage, PasswordBox
- Silverlight内存问题总结(四)—用Listbox 来模拟实现轻量级的TreeView控件,解决内存暴涨上百M的问题
- 稳扎稳打Silverlight(5) - 2.0控件之ListBox, MediaElement, MultiScaleImage, PasswordBox, ProgressBar, RadioButton
- 稳扎稳打Silverlight(36) - 3.0控件之TreeView, ListBox增强, DataGrid增强, MediaElement增强
- 稳扎稳打Silverlight(36) - 3.0控件之TreeView, ListBox增强, DataGrid增强, MediaElement增强
- 精通Silverlight——12.4.9 ListBox列表框控件
- 稳扎稳打Silverlight(62) - 5.0控件之PivotViewer, ListBox 和 ComboBox 新特性, OpenFileDialog 和 SaveFileDialog 新特性
- 稳扎稳打Silverlight(36) - 3.0控件之TreeView, ListBox增强, DataGrid增强, MediaElement增强
- silverlight:ListBox中如何取得DateTemplate/ItemsPanelTemplate中的命名控件?
- 稳扎稳打Silverlight(5) - 2.0控件之ListBox, MediaElement, MultiScaleImage, PasswordBox, ProgressBar, RadioButton
- 上接稳扎稳打Silverlight(5) - 2.0控件之ListBox, MediaElement, MultiScaleImage, PasswordBox
- Silverlight教程第六部分:使用用户控件实现主从表场景
- 如何为IDE注册第三方Silverlight控件
- silverlight在XAML中设置控件焦点
- silverlight telerik RadGridView 列头显示其他控件
- WPF&Silverlight之XamlReader动态创建控件并绑定
- Silverlight 控件开发之 "extern alias” 关键字
- 《有博天天读》Silverlight中InkPresenter控件综合应用实例
- Silverlight 2.0 Beta1 控件一览!
- Essential 银光仪表盘控件包Essential Gauge for Silverlight控件下载及介绍