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