天天看點

MVVM模式下實作Listview内部拖放功能

在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  需要可以引用到
}