【问题标题】:How to update ListCollectionView? [closed]如何更新 ListCollectionView? [关闭]
【发布时间】:2021-02-03 07:10:49
【问题描述】:

上下文是我想在 ViewModel 中暴露一个ListView ListCollectionView; ViewModel 会缓慢更新 ObservableCollection(填充集合需要几秒钟)。

因此,我想在ObservableCollection 以这种方式更新后更新ListCollectionView

MyObservableCollection.CollectionChanged += CollectionChanged;

private void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    MyListCollectionView.AddNewItem(e.NewItems);
    MyListCollectionView.CommitNew();
}

我尝试更新ListCollectionView,但即使使用List<> 也失败了。我该怎么做?

[TestClass]
public class ListViewTests
{
    private ListCollectionView _sut;

    [TestInitialize]
    public void Setup()
    {
        var toadd = new List<int> {};
        _sut = new ListCollectionView(toadd);
    }

    [TestMethod]
    public void AddItem()
    {
        var toadd = new List<int> { 1,2,3 };
        _sut.AddNewItem(toadd);
        _sut.CommitNew();
    }
}

System.InvalidOperationException:此视图不允许使用“AddNewItem”。

更多详情,我如何更新ObservableCollection

Parallel.ForEach(ShTiffFiles, file =>
{
    var sht = new ShutterTiff(file, _aesService); // slow (small Model)
    var shtv = new ShutterTiffVignette(sht, _fastCache); // slow (small ViewModel)
    lock (_o) // make it thread safe
    {
        Application.Current.Dispatcher.Invoke(() =>
        {
            ShutterTiffObservableCollection.Add(shtv);
        });
    }
});

在 ViewModel 中:

private object _o = new object();

【问题讨论】:

  • 添加到 mm8 答案:如果您将 int[] 更改为 List&lt;int&gt;var toadd = new List&lt;int&gt; { 1,2,3 }; _sut.AddNewItem(toadd); 将不起作用
  • 更新后:为什么...为什么要使用ListCollectionView?而是直接ObservableCollection? ...为什么如果你真的需要使用 LCV 你不使用 MyListCollectionView = new ListCollectionView(MyObservableCollection) ?那么你不需要设置 CollectionChanged 事件处理程序
  • @Selvin 这是正确的观点。我不需要担心ListCollectionView,我只需要添加到ObservableCollection。那么AddNewItem 是什么?
  • @mm8 你是否暗示有几种方法可以更新 ListCollectionView ?
  • @mm8 我确实错过了那句话。不过,在这种情况下,AddNewItem(Object) 是什么?

标签: c# wpf


【解决方案1】:

Setup() 方法中toadd 的类型更改为List&lt;T&gt; 或任何其他实现IList 并实际提供Add 方法实现的集合:

Why System.Array class implements IList but does not provide Add()

您不能向数组“添加”某些内容。

还不清楚您的测试应该做什么?验证内置ListCollectionView 类型的功能?您应该专注于测试代码而不是测试框架类型。

*最后,我想在 ObservableCollection 更新后更新 ListCollectionView

然后包装ObservableCollection:

_sut = new ListCollectionView(observableCollection);

或者直接修改ObservableCollection。您似乎不需要在这里使用ListCollectionView。集合视图是框架在您绑定到源集合时为您创建的东西。更多信息请参考docs

【讨论】:

  • 我真的很喜欢你的回答。从中学到了很多也可能她只是想为框架中的一些新“事物”做一些游戏测试,而不是做一些实际测试
  • @styx:也许吧。这就是我写“不清楚”的原因。
  • @Soleil-MathieuPrévot:ListCollectionViewSetup() 方法中包装了一个数组。我编辑了我的答案以澄清这一点,因为您在测试方法中也有一个 toadd
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2012-03-08
  • 2022-01-22
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多