wpf 在mvvm中更新列表会使List不一致

d4so4syb  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(178)

我从不同的列表更新列表时出现异常。例如:List我在List 1中有一些员工,并希望将其添加到已经有一些员工的List 2中。所以列表2变成了列表1+列表2。List 2绑定到UI。但我收到异常,说明List 2现在不一致。我可以使用ObservableCollection代替List,但List 2是提供的dll的一部分。我不能改变它。我该怎么走?
样本代码:

private void AddCommandFunction(object obj)
        {
            try
            {
                var lstToBeCopied= objToBeCopied  //getting this from a different method
                var myList= (Employee)obj;
                foreach (var value in objToBeCopied.Employees)
                {
                    myList.Employees.Add(value);
                }
            }
            catch (Exception e)
            {
            }
        } //getting exception after this point.
ozxc1zmp

ozxc1zmp1#

在MVVM中,视图模型是模型和视图之间的“翻译器”。模型以最方便的方式格式化它的数据。似乎你的Employee对象就是Model。视图模型现在需要创建一个可供视图使用的结构。
在这种情况下,您可以使用ObservableCollection来 Package 列表。

public ObservableCollection<Employee> Employees { get; }

你会想要初始化它,最有可能是在构造器中...

Employees = new ObservableCollection<Employee>(myList);

这将给予你一个可以通知的集合,但它是一个副本。修改集合不会更新回模型。我们必须手动操作。
回到视图模型构造器中,注册属性的事件:

Employees.CollectionChanged += OnEmployeesChanged;

最后,实施变更:

public void OnEmployeesChanged(object sender, NotifyCollectionChangedEventArgs args)
{
    switch(args.Action)
    {
        case NotifyCollectionChangedAction.Add:
            // Add to the employee list, use args.NewItems to get the changed items.
            break;
        case NotifyCollectionChangedAction.Remove:
            // Remove from the model list, use args.OldItems to get the changed items.
            break;
    }
}

您可能还希望在事件中处理其他一些更改操作。这取决于你如何使用它。
缺陷:不幸的是,这不是一个完美的实现。如果有任何东西试图直接修改模型中的列表,则无法更新ObservableCollection,除非模型有自己的事件,您可以观察到该事件,以让您知道要更新。但是,如果您控制List并且可以确保没有任何东西直接修改它,那么只要您始终修改ObservableCollection而不是直接修改原始列表,此解决方案就可以工作。

相关问题