您的位置:首页 > 其它

SilverLight 控件ListBox中的SelectionChanged事件

2014-01-06 22:10 169 查看
出现的问题:

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 的作用就体现出来了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐