Listbox SelectionChanged срабатывает при установке на -1 внутри функции, wp7 - PullRequest
3 голосов
/ 06 октября 2011

Я столкнулся с очень странной проблемой в 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;
  }

Вот проблема: всякий раз, когда я нажимаю на один из трех элементов списка, код myhandle делает выбор равным правильному SelectedIndex, но затем он достигает строки box.SelectedIndex =-1; и затем refires функция myhandle.При этом выбор теперь равен -1.

Я понятия не имею, почему он восстанавливает стек.Это не должно быть рекурсивной функцией.

Моя цель - выбрать элемент, но затем вернуть SelectedIndex обратно в -1, чтобы человек мог выбрать элемент еще раз, если это необходимо, вместопереход к другому элементу и обратно.

Конечно, есть простое исправление - бросить функцию переключателя и проверить, есть ли уже -1, но это не решает проблему рекурсии.

Спасибо за время.

Ответы [ 3 ]

8 голосов
/ 06 октября 2011

Каждый раз, когда изменяется выбор, происходит событие 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;
        }
    }
}
6 голосов
/ 07 октября 2011

Стандартные образцы 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», вы должны помнить одно и то же.

4 голосов
/ 09 ноября 2012

Вы можете проверить args.AddedItems.Count тоже:

private void myhandle(object sender, SelectionChangedEventArgs args) 
{
   if (args.AddedItems.Count > 0)
   {
       ....
       box.SelectedIndex = -1;
   }
}
...