0

右クリックでリストボックスの項目を削除したい。しかし、私の場合、右クリックイベントは機能しませんでした。以下は私が試したコードです。

コンストラクターで:

listBox1.MouseDown += new MouseButtonEventHandler(listBox1_MouseRightClick);

右クリック:

private void listBox1_MouseRightClick(object sender, MouseButtonEventArgs e)
    {
        if (sender is ListBoxItem)
        {
            ListBoxItem item = (ListBoxItem)sender;
            Harvest_TimeSheetEntry entryToDelete = (Harvest_TimeSheetEntry)item.DataContext;

            MessageBoxResult Result = System.Windows.MessageBox.Show("Are you sure?", "Delete Confirmation", System.Windows.MessageBoxButton.YesNo);

            if (Result == MessageBoxResult.Yes)
            {
                Globals._globalController.harvestManager.deleteHarvestEntry(entryToDelete);
            }
            else
            {
                System.Windows.MessageBox.Show("Delete operation Terminated");
            }
        }
    }

xaml で:

<ListBox x:Name="listBox1" ItemsSource="{Binding}" Margin="0,131,0,59" ItemTemplateSelector="{StaticResource templateSelector}" SelectionMode="Single" MouseRightButtonDown="listBox1_MouseRightClick">
    <ListBox.ItemContainerStyle>
       <Style TargetType="{x:Type ListBoxItem}">
           <EventSetter Event="MouseDown" Handler="listBox1_MouseRightClick"/>
       </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

右クリックイベントを使用して機能させるにはどうすればよいですか?

4

2 に答える 2

1

元のコードは冗長で冗長に見えます。MouseRightButtonDownリストボックス項目の選択を処理するイベントが既に存在し、ListBoxItemdatacontext が単にSelectedItemlistBox1 のものであるため、機能しません。

スタイルのオーバーライドを取り除き、プレビュー イベントでリストボックスを宣言するだけです。MouseRightButtonDownこれは、バブルではなくトンネルになります。

<ListBox x:Name="listBox1"
         ItemsSource="{Binding}"
         ItemTemplateSelector="{StaticResource templateSelector}"
         Margin="0,131,0,59"
         SelectionMode="Single" 
         PreviewMouseRightButtonDown="listBox1_MouseRightClick" />

コンストラクターで、これを取り除きます

listBox1.MouseDown += new MouseButtonEventHandler(listBox1_MouseRightClick);

これで、イベント ハンドラーにsenderlistbox1 が追加されましたが、このイベントを他のリストボックスに結び付けていない場合は、単に listbox1 から selectedItem を取得して、適切なオブジェクトにキャストします。それ以外の場合は、複数のリストボックスの機能をキャストsenderしたい場合ListBox

private void listBox1_MouseRightClick(object sender, MouseButtonEventArgs e)
{
      Harvest_TimeSheetEntry entryToDelete = (Harvest_TimeSheetEntry)listBox1.SelectedItem;
      if(entryToDelete != null)
      {
          //Do work
      }
}
于 2013-08-19T16:34:28.277 に答える
0

右クリックでレコードを削除するのは良い設計ではなく、ユーザーが機能をより混乱させる原因となります。それでも何かしたい場合は、PreviewMouseRightButtonDownイベントに行くことができます。以下のスニペットをご覧ください

ListBox1.PreviewMouseRightButtonDown += new MouseButtonEventHandler(ListBox1_MouseRightButtonDown);

次のように XAML を変更します。

<ListBox x:Name="listBox1"
             ItemsSource="{Binding}"
             Margin="0,131,0,59"
             ItemTemplateSelector="{StaticResource templateSelector}"
             SelectionMode="Single">
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <EventSetter Event="PreviewMouseRightButtonDown"
                             Handler="ListBox1_PreviewMouseRightButtonDown" />
            </Style>
        </ListBox.ItemContainerStyle>
</ListBox>
于 2013-08-19T15:26:04.390 に答える