[英]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.