我有一个listview,其属性SelectionMode设置为Extended。
我也有一个垃圾按钮。我试图在列表视图上的所选项目上执行删除操作,当用户拖动一个或多个所选项目时(如果有多个项目则使用shift键)并删除删除按钮。
我已在listview中使用单个选定项目实现它,它可以正常工作。现在我尝试对listview中的多个选定项目执行相同操作但没有成功。
下面的代码适用于在listview中选择一个项目并且用户将其从listview拖放到删除按钮时:
<ListView Margin="10" Name="lvUsers" ItemsSource="{Binding Path=Items}" SelectionMode="Extended">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="MouseMove" Handler="lstItems_MouseMove" />
</Style>
</ListView.ItemContainerStyle>
<!-- other stuff -->
</Listview>
<Button AllowDrop="True" Drop="btnDelete_Drop" Height="64" Width="64" Margin="10" Click="BtnDelete_Click" Content="Delete"/>
和代码隐藏:
private void lstItem_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
if (e.Source != null)
{
DataModel selectedItem = (DataModel)lvUsers.SelectedItem;
DragDrop.DoDragDrop(lvUsers, selectedItem, DragDropEffects.Move);
}
}
}
private void btnDelete_Drop(object sender, DragEventArgs e)
{
Type myType = typeof(DataModel);
string modelns = myType.FullName;
DataModel selectedItem = e.Data.GetData(modelns) as DataModel;
MessageBox.Show(selectedItem.Name);
}
listview上的每个listviewitem都是以下数据类型:
public class DataModel
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
public string Mail
{
get;
set;
}
}
例如,当用户将拖动的listviewitem放在删除按钮上时,我会显示一个带有该人姓名的消息框。
如何执行相同的操作,而不是从listview中拖放单个项目,对多个选定的listviewitems执行相同的操作?一旦掉线,在内 btnDelete_Drop我想迭代所有删除的listviews项目并做一些事情。
答案 0 :(得分:0)
我刚刚实施了一个有效的解决方案。我在代码隐藏中替换了方法lstItem_MouseMove和btnDelete_Drop:
private void lstItem_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
if (e.Source != null)
{
List<DataModel> myList = new List<DataModel>();
foreach (DataModel Item in lvUsers.SelectedItems)
{
myList.Add(Item);
}
DataObject dataObject = new DataObject(myList);
DragDrop.DoDragDrop(lvUsers, dataObject, DragDropEffects.Move);
}
}
}
private void btnDelete_Drop(object sender, DragEventArgs e)
{
Type myType = typeof(List<DataModel>);
List<DataModel> selectedItems = e.Data.GetData(myType) as List<DataModel>;
string hello = "Hello ";
foreach (DataModel dm in selectedItems)
{
hello = hello + ", " + dm.Name;
}
MessageBox.Show(hello);
}
这是有效的,但可能还有其他更好的解决方案。欢迎提出任何建议。