3

我有一个带有绑定的 ListBox,当我添加 Items 时它工作得很好,但是如果我尝试使用 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);
}    

但它不起作用。有人知道我做错了什么吗?谢谢

好的,伙计们,我现在有了解决方案问题是 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

初始化表单时尝试添加:

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 listview右键问题

于 2013-08-30T13:15:39.490 回答
0

为什么不对所有人使用绑定。

将项目源绑定为 ObservableCollection blabla

将 Selecteditem 绑定为 XXXX

对您的按钮使用命令,当您想要删除一个项目时,请执行以下操作:

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

除了 Joan 说的,你还可以像这样在 Xaml 中这样做:

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

</ListBox>

您应该阅读如何使用绑定和 MVVM 模型。这样的东西很方便。以下是一些链接: 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 回答