当我在listView上为DnD使用Josh Smith的问题时,我遇到了一些困难。
我有一个"DetailTable“的ObservableCollection,它是在创建视图时在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">然后我在视图CodeBehind中为DnD调用Josh Smith的类:
public DataView()
{
InitializeComponent();
new ListViewDragDropManager<DetailTable>(this.ListeViewTables);
}到目前为止,拖放工作正常,但在ViewModel中,ObservableCollection的项目顺序与我在视图中所做的并不一致。
示例:如果我将项目-3移动到-3\f25 5-3位置,在视图中是可以的,但是当我调试时,我看到项目总是在-3\f25 ObservableCollection -3\f6中的-3\f25 3-3位置。
对于我想要做的事情,这是非常有问题的,我希望有人能帮助我!
谢谢
发布于 2018-01-03 16:47:20
如果一个人有同样的问题,只需在ListViewDragDropManager上添加事件ProcessDrop
然后,在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
发布于 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控件项的样式,但您可以选择任何一种方法。
https://stackoverflow.com/questions/48063982
复制相似问题