【问题标题】:How to update ObservableCollection in codeBehind after drag and drop on listview - WPF MVVM如何在 listview 上拖放后更新 codeBehind 中的 ObservableCollection - WPF MVVM
【发布时间】:2018-01-02 15:56:04
【问题描述】:

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

我有一个“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">

然后我在 View CodeBehind 中为 DnD 调用 Josh Smith 的班级:

public DataView()
{
    InitializeComponent();

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

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

示例:如果我将 item-3 移动到第 5 位,则 View 可以,但是当我调试时,我看到 item-3 总是在我的 ObservableCollection 中的第 3 位。

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

谢谢

【问题讨论】:

  • 你有乔希·史密斯班级的网址吗?
  • @EdPlunkett 是的,当然! Used by NuGet

标签: c# wpf listview mvvm drag-and-drop


【解决方案1】:

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

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

    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

【讨论】:

    【解决方案2】:

    以下是一般情况下的处理方法。通过处理 Smith 的 ProcessDrop 事件,OP 能够使其与 Smith 的代码一起按需要工作。

    在drop handler中判断目标ListView的ItemsSource是否为null。

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

    如果您没有ItemsSource,则只有 ListViewItems。重新排序Items。简单。

    我以前从未见过Josh Smith's code,如果您需要更新,他会是您可以与之交谈的人。就个人而言,我使用 Adorner 而不是重新设置列表控件项的样式,但您可以为任何一种方法提供案例。

    【讨论】:

    • Nothing 为空,ItemsSourceObservableCollection&lt;T&gt;,我看到并正确使用了 listView。我里面有一些checkBox和TextBox,都是更新的,但不是拖放后的顺序。
    • @Furiks 你是在问一个问题,还是在告诉我我的回答有一些你不清楚的地方?
    • 我好像没听懂
    • @Furiks 你在处理ListViewDragDropManager 的ProcessDrop 事件吗?
    • 谢谢!我不明白它的用处,但现在它工作了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2014-01-15
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2023-04-06
    • 2011-08-25
    相关资源
    最近更新 更多