ObservableCollection ListBox项目删除不起作用

时间:2013-08-30 13:06:05

标签: c# silverlight xaml windows-phone-8

我有一个带有绑定的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);
}    

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

好的家伙我现在已经解决方案问题是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 个答案:

答案 0 :(得分:0)

尝试在初始化表单时添加:

lstPersons.ItemsSource = personList ;

How to: Create and Bind to an 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 right-click problem

答案 1 :(得分: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之前,我在显示列表方面也遇到了一些问题。

答案 2 :(得分: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
                    } 
         }


    } 

答案 3 :(得分:0)

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

将项目来源绑定为ObservableCollection blabla

将Selecteditem绑定为XXXX

使用按钮命令,当您想要删除项目时:

blabla.remove(SelectedItem);