列表框SelectionChanged在函数wp7中设置为-1时触发

时间:2011-10-06 19:39:46

标签: windows-phone-7 silverlight-4.0 listbox selectedindex

我在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,但这并不能解决递归的问题。

感谢您的时间。

3 个答案:

答案 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;
   }
}