3

私はc#で非常に奇妙な問題に遭遇していて、これを引き起こしている原因を知りたかっただけです。私には自分の理論がありますが、完全にはわかりません。それを再現できるかどうかだけを確認したいと思います。

wp7Silverlight4の標準ピボットページ。

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

問題は次のとおりです。3つのlistboxitemsのいずれかをクリックすると、myhandleコードは適切なSelectedIndexと等しい選択を行いますが、そのbox.SelectedIndex =-1;行にヒットし、次にrefiresmyhandle関数にヒットします。そうすることで、選択は-1になります。

なぜスタックをバックアップするのかわかりません。これは再帰関数であってはなりません。

私の目標はアイテムを選択することですが、SelectedIndexを-1に戻して、必要に応じて別のアイテムに変更して元に戻すのではなく、アイテムをもう一度選択できるようにします。

確かに、スイッチ関数をスローして、それがすでに-1であるかどうかを確認する簡単な修正がありますが、それは再帰の問題を解決しません。

時間をありがとう。

4

3 に答える 3

9

選択が変更されるたびに、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;
        }
    }
}
于 2011-10-06T19:53:46.637 に答える
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」プロパティにバインドする場合は、同じことを覚えておく必要があります。

于 2011-10-07T11:25:09.020 に答える
4

args.AddedItems.Countも確認できます。

private void myhandle(object sender, SelectionChangedEventArgs args) 
{
   if (args.AddedItems.Count > 0)
   {
       ....
       box.SelectedIndex = -1;
   }
}
于 2012-11-09T12:30:46.720 に答える