wpf mvvm实现 listbox拖动排序代码
时间: 2023-07-29 16:12:26 浏览: 54
以下是基于WPF MVVM实现ListBox拖动排序的代码示例:
首先,我们需要使用System.Windows.Interactivity和Microsoft.Expression.Interactions这两个NuGet包。
然后,在ListBox上添加以下命名空间:
```xml
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
```
接着,在ListBox上添加以下代码:
```xml
<ListBox ItemsSource="{Binding Items}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<ei:ChangePropertyAction PropertyName="AllowDrop" Value="True"/>
</i:EventTrigger>
<i:EventTrigger EventName="PreviewMouseLeftButtonDown">
<ei:CallMethodAction MethodName="PreviewMouseLeftButtonDown"/>
</i:EventTrigger>
<i:EventTrigger EventName="Drop">
<ei:CallMethodAction MethodName="Drop"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
```
在ViewModel中,我们需要实现以下几个方法:
```csharp
public class MainViewModel
{
public ObservableCollection<Item> Items { get; set; } = new ObservableCollection<Item>();
private Item _draggedItem;
private int _draggedIndex;
public void PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var listBoxItem = FindVisualParent<ListBoxItem>((DependencyObject)e.OriginalSource);
if (listBoxItem == null) return;
_draggedItem = (Item)listBoxItem.DataContext;
_draggedIndex = Items.IndexOf(_draggedItem);
DragDrop.DoDragDrop(listBoxItem, listBoxItem.DataContext, DragDropEffects.Move);
}
public void Drop(object sender, DragEventArgs e)
{
var listBoxItem = FindVisualParent<ListBoxItem>((DependencyObject)e.OriginalSource);
if (listBoxItem == null) return;
var targetItem = (Item)listBoxItem.DataContext;
var targetIndex = Items.IndexOf(targetItem);
Items.Move(_draggedIndex, targetIndex);
_draggedItem = null;
}
private static T FindVisualParent<T>(DependencyObject child) where T : DependencyObject
{
while (true)
{
var parentObject = VisualTreeHelper.GetParent(child);
if (parentObject == null) return null;
if (parentObject is T parent) return parent;
child = parentObject;
}
}
}
public class Item
{
public string Name { get; set; }
}
```
这里使用了一个辅助方法FindVisualParent,用于查找父级元素。PreviewMouseLeftButtonDown方法用于设置拖动项和拖动项的索引,Drop方法用于移动项,Items.Move方法会自动更新UI。
最后,我们需要在MainWindow中绑定ViewModel:
```xml
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
```
这样,我们就实现了ListBox拖动排序的功能。