在MVVM模式下實作Listview内部各Item的拖放功能,便于調整各個Item的位置。
需要的元件:Interactivity.dll 和 Interactions.dll
xmlns:Interactivity="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:Interactions="http://schemas.microsoft.com/expression/2010/interactions"
在XAML檔案中,設定相應的 DataContext
<ListView ItemsSource="{Binding YourObjectCollection}">
<Interactivity:Interaction.Triggers>
<Interactivity:EventTrigger EventName="PreviewMouseLeftButtonDown">
<Interactions:CallMethodAction TargetObject="{Binding}" MethodName="PreviewMouseLeftButtonDownCommand"/>
</Interactivity:EventTrigger>
<Interactivity:EventTrigger EventName="MouseLeftButtonUp">
<Interactions:CallMethodAction TargetObject="{Binding}" MethodName="MouseLeftButtonUp"/>
</Interactivity:EventTrigger>
</Interactivity:Interaction.Triggers>
</ListView>
在 ViewModel中
public void PreviewMouseLeftButtonDownCommand(object sender,MouseButtonEventArgs e) // MouseLeftButtonDown 可能也可以用
{
ListView listview = sender as ListView;
HitTestResult result = VisualTreeHelper.HitTest(listview, Mouse.GetPosition(listview));
Rectangle rect = result.VisualHit as Rectangle;
if (rect != null)
{
YourObject source = rect.DataContext as YourObject ;
}//ObservableCollection<YourObject > YourObjectCollection;
}
public void MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
ListView listview = sender as ListView;
HitTestResult result = VisualTreeHelper.HitTest(listview, Mouse.GetPosition(listview));
Rectangle rect = result.VisualHit as Rectangle;
if (rect != null)
{
YourObject dest = rect.DataContext as YourObject ;
}
//接下來就可以處理YourObjectCollection 中的 source 與 dest 了 ,source 需要可以引用到
}