首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在listview - WPF MVVM上拖放后更新codeBehind中的ObservableCollection

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

Stack Overflow用户
提问于 2018-01-02 23:56:04
回答 2查看 777关注 0票数 0

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

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

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

代码语言:javascript
运行
复制
public ObservableCollection<DetailTable> ListeTablesDisplay
{
    get
    {
        var l = ListeTables.View.Cast<DetailTable>().ToList();
        return new ObservableCollection<DetailTable>(l);
    }
}

Xaml文件中的listView:

代码语言:javascript
运行
复制
    <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">

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

代码语言:javascript
运行
复制
public DataView()
{
    InitializeComponent();

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

到目前为止,拖放工作正常,但在ViewModel中,ObservableCollection的项目顺序与我在视图中所做的并不一致。

示例:如果我将项目-3移动到-3\f25 5-3位置,在视图中是可以的,但是当我调试时,我看到项目总是在-3\f25 ObservableCollection -3\f6中的-3\f25 3-3位置。

对于我想要做的事情,这是非常有问题的,我希望有人能帮助我!

谢谢

EN

回答 2

Stack Overflow用户

发布于 2018-01-03 16:47:20

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

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

代码语言:javascript
运行
复制
    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

票数 1
EN

Stack Overflow用户

发布于 2018-01-03 00:02:02

下面是在一般情况下如何处理此问题。通过处理史密斯的ProcessDrop事件,OP能够使其在史密斯的代码中按预期工作。

在drop处理程序中,确定目标ListView的ItemsSource是否为空。

如果您有一个ItemsSource,请将其强制转换为System.Collections.IList,然后在list上执行重新排序操作,而不是在Items上。忘记这个分支中的Items吧。如果项目来源是ObservableCollection<T>,则ListView中的排序将更新。如果不是,那就不是你的问题了。提供了错误列表类型的代码使用者需要发布一个问题,询问为什么WPF没有收到来自List<T>int[]String或其他任何东西的更改通知。

如果你没有ItemsSource,你就有ListViewItems。重新排序Items。很简单。

我以前从未见过Josh Smith's code,如果你需要更新,他会是你的倾诉对象。就我个人而言,我使用的是Adorner,而不是重新设计list控件项的样式,但您可以选择任何一种方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48063982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档