3

バインディング付きの ListBox があります。アイテムを追加すると完璧に機能しますが、contextMenu でアイテムを削除しようとすると機能しません。

これが私がこれまでに試したことですListBox Xamlコード

   <ListBox Name="lstPersons"
                     VerticalAlignment="Stretch"
                     HorizontalAlignment="Stretch" Margin="126,-228,2,-242">
                <toolkit:ContextMenuService.ContextMenu>
                    <toolkit:ContextMenu Name="PersonContext">
                        <toolkit:MenuItem Name="PersonDelete" Header="Delete" Click="DeletePerson_Click"/>
                    </toolkit:ContextMenu>
                </toolkit:ContextMenuService.ContextMenu>
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>    
                            <TextBlock Name="btnKellnerName"                                      
                                             Text="{Binding _PersonName}" 
                                             FontSize="35" 
                                             FontFamily="Portable User Interface"/>
                            <TextBlock Name="btnPosition"
                                             Text="{Binding _PersonPosition}"
                                             FontSize="22"/>
                            <TextBlock Name="lblUhrzeit" 
                                             Text="{Binding _CreationDate}"
                                             FontSize="18"/>
                            <TextBlock Name="Space" Text="                "/>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

そしてバインディング クラス コード

public class Person 
{    
    public string _PersonName { get; set; }      
    public string _PersonPosition { get; set; }    
    public string _CreationDate { get; set; }   
}

このようなアイテムを追加すると

ObservableCollection<Person> personList = new ObservableCollection<Person>();

personList.Add(new Person { 
_PersonName = "Tom",
_PersonPosition = "Bla", 
_CreationDate = "33"
});

this.lstPerson.ItemSource = personList;

それは完璧に動作します!今、私はこのような ContextMenu で選択した項目を削除したい

private void DeletePerson_Click(object sender, RoutedEventArgs e)
{   
   int indexPerson = lstPerson.SelectedIndex;

   personList.RemoveAt(indexPerson);
}    

しかし、うまくいきません。誰かが私が間違っていることを考えていますか? ありがとう

OK みんな私は今解決策を持っています。問題は SelectedIndex の値であり、今では正しい値を取得しています。まず、ContextMenu を ListBoxItemTemplate/StackPanel 内に配置します。

コードビハインド:

private void DeletePerson_Click(object sender, RoutedEventArgs e)
  {
      try {

                var selectedListBoxItem = listBox.ItemContainerGenerator.ContainerFromItem(((MenuItem) sender).DataContext) as ListBoxItem;
                var selectedIndex = listBox.ItemContainerGenerator.IndexFromContainer(selectedListBoxItem);

                _personList.RemoveAt(selectedIndex);
         }
         catch( Exception ex ) { MessageBox.Show(ex.Message); };
  }    
4

4 に答える 4

0

Joan が言ったことに加えて、次のように Xaml でこれを行うこともできます。

<ListBox ItemsSource={Binding personList}
                 VerticalAlignment="Stretch"
                 HorizontalAlignment="Stretch" Margin="126,-228,2,-242">
            <toolkit:ContextMenuService.ContextMenu>

</ListBox>

Bindings と MVVM-Model の使用方法を読む必要があります。このようなものにはかなり便利です。ここにいくつかのリンクがあります: http://channel9.msdn.com/Events/MIX/MIX10/EX14 http://channel9.msdn.com/Events/MIX/MIX11/OPN03

がっかりしないでください。最初は少し勉強になりますが、それだけの価値があります。また、Laurent Bugnions の MvvmLight パッケージを使用して MVVM ですべてを行う前に、リストの表示に問題がありました。

于 2013-08-30T13:24:53.633 に答える
0

これを試して:

private void DeletePerson_Click(object sender, RoutedEventArgs e)
    {   
       System.Collections.IList pathRemove;
       pathRemove = lstPerson.SelectedItems;

       if(pathRemove.Count != 0)
          {
               for (int i = pathRemove.Count - 1; i >= 0; i--)
                    {
                        lstPerson.Remove((Person)pathRemove[i]);//multiple deletes
                    } 
         }


    } 
于 2013-08-30T13:26:25.170 に答える
0

すべてにバインディングを使用しないのはなぜですか。

ObservableCollection blabla としてアイテム ソースをバインドします。

Selecteditem を XXXX としてバインド

ボタンにコマンドを使用し、アイテムを削除する場合は次のようにします。

blabla.remove(SelectedItem);
于 2013-08-30T15:22:17.743 に答える
0

フォームが初期化されるときにこれを追加してみてください:

lstPersons.ItemsSource = personList ;

方法: ObservableCollection を作成してバインドする

選択したアイテムが原因で問題が発生しているようです

重要なのは、PreviewMouseRightButtonDown イベントを正しい場所に設定することです。お気づきのように、ContextMenu がなくても ListViewItem を右クリックするとその項目が選択されるため、ListView ではなく各項目にイベントを設定する必要があります。

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <EventSetter Event="PreviewMouseRightButtonDown"
                         Handler="OnListViewItemPreviewMouseRightButtonDown" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Menu Item">Item 1</MenuItem>
            <MenuItem Header="Menu Item">Item 2</MenuItem>
        </ContextMenu>
    </ListView.ContextMenu>
    <ListViewItem>Item</ListViewItem>
    <ListViewItem>Item</ListViewItem>
    <ListViewItem>Item</ListViewItem>
    <ListViewItem>Item</ListViewItem>
    <ListViewItem>Item</ListViewItem>
    <ListViewItem>Item</ListViewItem>
</ListView>

.

private void OnListViewItemPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    Trace.WriteLine("Preview MouseRightButtonDown");

    e.Handled = true;
}

wpfリストビューの右クリックの問題

于 2013-08-30T13:15:39.490 に答える