我在c#中遇到了一个非常奇怪的问题,我只是想知道是什么导致了这个问题。我有我的理论,但不完全确定,只是想看看它是否可以复制。
wp7 silverlight 4中的标准数据透视页。
<Pivot>
<PivotItem>
<Listbox Width="400" Height="500" x:Name="box" SelectionChanged="myhandle">
<ListBoxItem x:Name="item1">
<TextBlock Height="40" Width="200" Text="hi everyone!"/>
</ListBoxItem>
<ListBoxItem x:Name="item2">
<TextBlock Height="40" Width="200" Text="No Wai"/>
</ListBoxItem>
<ListBoxItem x:Name="item3">
<TextBlock Height="40" Width="200" Text="Ya Rly!"/>
</ListBoxItem>
</Listbox>
</PivotItem>
</Pivot>
在我的C#中,我有以下内容:
private void myhandle(object sender, SelectionChangedEventArgs args)
{
var selection ="";
selection = (sender as Listbox).SelectedIndex.ToString();
box.SelectedIndex = -1;
}
问题在于:每当我点击三个listboxitems中的一个时,myhandle代码会使选择等于正确的SelectedIndex,但它会点击box.SelectedIndex =-1;
行然后refires
myhandle函数。这样做,选择现在为-1。
我不知道它为什么要回到堆栈。这不应该是一个递归函数。
我的目标是选择项目,然后将SelectedIndex返回-1,以便此人可以在需要时再次选择项目,而不是更改为其他项目并返回。
当然有一个简单的方法是抛出一个switch函数并检查它是否已经-1,但这并不能解决递归的问题。
感谢您的时间。
答案 0 :(得分:8)
每次更改选择时,都会触发SelectionChanged事件。这包括清除选择,包括设置SelectedIndex = -1,即使您已经在SelectionChanged处理程序中。
您可以这样做:
private bool inMyHandle = false;
private void myhandle(object sender, SelectionChangedEventArgs args)
{
if (!this.isMyHandle) {
this.isMyHandle = true;
try {
var selection ="";
selection = (sender as Listbox).SelectedIndex.ToString();
box.SelectedIndex = -1;
}
finally {
this.isMyHandle = false;
}
}
}
答案 1 :(得分:6)
标准MS样本已在标准的列表框选定项目事件中使用此项。
只需在事件处理程序代码中使用以下内容:
private void ListBox_SelectionChanged(object sender,System.Windows.Controls.SelectionChangedEventArgs e)
{
// If selected index is -1 (no selection) do nothing
if (ListBox.SelectedIndex == -1)
return;
//Do Something
// Reset selected index to -1 (no selection)
ListBox.SelectedIndex = -1;
}
无需任何布尔处理程序,如果“-1”是当前索引,则该函数无效。 所有这些都是为了弥补标准列表框的运行方式。
如果你使用MVVM并绑定到“Selecteditem”/“SelectedIndex”属性,你必须记住同样的事情。
答案 2 :(得分:4)
您也可以检查args.AddedItems.Count:
private void myhandle(object sender, SelectionChangedEventArgs args)
{
if (args.AddedItems.Count > 0)
{
....
box.SelectedIndex = -1;
}
}