如何在listview - WPF MVVM上拖放后更新codeBehind中的ObservableCollection

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在listview - WPF MVVM上拖放后更新codeBehind中的ObservableCollection相关的知识,希望对你有一定的参考价值。

当我在listView上使用Josh Smith的DnD问题时,我遇到了一些困难。

我有一个ObservableCollection“DetailTable”,我在创建视图时在ViewModel中初始化:

(ListeTables是CollectionViewSource,我初始化并使用我的数据)

public ObservableCollection<DetailTable> ListeTablesDisplay
{
    get
    {
        var l = ListeTables.View.Cast<DetailTable>().ToList();
        return new ObservableCollection<DetailTable>(l);
    }
}

Xaml文件中的listView:

    <ListView Name="ListeViewTables" SelectionMode="Single" 
              AllowDrop="true"
              ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
              ItemsSource="{Binding ListeTablesDisplay, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" 
              SelectedItem="{Binding SelectedTable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
              Margin="10,83,831,61">

然后我在View CodeBehind中为DnD调用Josh Smith的类:

public DataView()
{
    InitializeComponent();

    new ListViewDragDropManager<DetailTable>(this.ListeViewTables);
}

到目前为止,拖放工作正常,但在ViewModel中,ObservableCollection的项目顺序与我在View中的操作不一致。

示例:如果我将item-3移动到第5个位置,则可以使用View,但是当我调试时,我看到item-3总是在我的ObservableCollection中的第3个位置。

对于我想做的事情来说,这是非常有问题的,我希望有人可以帮助我!

谢谢

答案

如果一个人有同样的问题,只需在ProcessDrop上添加事件ListViewDragDropManager

然后在viewModel中,事件需要手动移动ObservableCollection中的项索引

    public static void OnProcessDrop(object sender, ProcessDropEventArgs<T> e)
    {
        e.ItemsSource.Move(e.OldIndex, e.NewIndex);

        e.Effects = DragDropEffects.Move;
    }

Here an example by the autor of ListViewDragDropManager - "Custom drop logic" for help

另一答案

以下是在一般情况下如何处理这个问题。通过处理史密斯的ProcessDrop事件,OP能够通过史密斯的代码按照需要使其工作。

在drop handler中,确定目标ListView的ItemsSource是否为null。

如果你有一个ItemsSource,把它投到System.Collections.IList并在列表上进行重新排序操作,而不是在Items上。在这个分支忘记Items。如果items source是ObservableCollection<T>,则ListView中的排序将更新。如果不是,那不是你的问题。提供错误列表类型的代码的消费者需要发布一个问题,询问为什么WPF不会从List<T>int[]String或其他任何内容获得更改通知。

如果你没有ItemsSource,你只需要ListViewItems。重新排序Items。简单。

我以前从未见过Josh Smith's code,如果你需要更新,他就是那个可以交谈的人。就个人而言,我使用Adorner而不是重新列出列表控件项,但您可以为这两种方法提供案例。

以上是关于如何在listview - WPF MVVM上拖放后更新codeBehind中的ObservableCollection的主要内容,如果未能解决你的问题,请参考以下文章

WPF MVVM C#:列表框拖放而没有代码

如何将listView的selectedItem值传递到wpf MVVM中的另一页

使用 MVVM 从 WPF ListView 项触发双击事件

WPF - 拖放 - 装饰器在控件外消失

WPF MVVM模式下实现ListView下拉显示更多内容

如何在图像上拖放绘制的多边形