[英]How to update ObservableCollection in codeBehind after drag and drop on listview - WPF MVVM
在listView上将Josh Smith的问题用于DnD时遇到了一些困难。
创建视图时,我在ViewModel中初始化了一个“ DetailTable”的ObservableCollection:
(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,但是当我调试时,我在ObservableCollection中总是将item-3移到第3个位置。
我要做的事情很麻烦,希望有人能帮助我!
谢谢
如果一个人有同样的问题,只需在ListViewDragDropManager
上添加事件ProcessDrop
然后在viewModel中,事件需要手动移动ObservableCollection中的项目索引
public static void OnProcessDrop(object sender, ProcessDropEventArgs<T> e)
{
e.ItemsSource.Move(e.OldIndex, e.NewIndex);
e.Effects = DragDropEffects.Move;
}
这是在一般情况下的处理方法。 通过处理Smith的ProcessDrop
事件,OP可以使它与Smith的代码一起工作。
在放置处理程序中,确定目标ListView的ItemsSource
是否为null。
如果您有ItemsSource
,请将其ItemsSource
为System.Collections.IList
然后对列表 (而不是Items
进行重新排序操作。 忘记此分支中的Items
。 如果项源是ObservableCollection<T>
,则ListView中的顺序将更新。 如果不是,那不是您的问题。 您的代码使用者提供了错误的列表类型,需要发布一个问题,询问为什么WPF无法从List<T>
或int[]
或String
或任何其他内容获得更改通知。
如果没有ItemsSource
,则只有ListViewItems。 重新订购Items
。 简单。
我从未见过Josh Smith的代码 ,如果您需要更新,他将是可以与之交谈的人。 就个人而言,我使用的是Adorner而不是重新设置列表控件的样式,但是您可以为这两种方法辩护。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.