如何在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的主要内容,如果未能解决你的问题,请参考以下文章
如何将listView的selectedItem值传递到wpf MVVM中的另一页