首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF UI未在更改ConcurrentBag类型集合时更新

WPF UI未在更改ConcurrentBag类型集合时更新
EN

Stack Overflow用户
提问于 2012-01-15 09:16:49
回答 2查看 2.1K关注 0票数 2

我有一个集合,它被绑定到WPF UI中的datagrid。

我的要求是,对于集合中的每一项,我必须每秒更新属性的值10次。

所以我采用了ConcurrentBag类型集合。在更新每个项目的值之后。我明确地解雇了RaisePropertyChange。但是用户界面并没有改变。

代码语言:javascript
运行
AI代码解释
复制
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    if (stockCollection != null)
    {
        stockCollection.ToList().ForEach((s) => s.Price = DateTime.Now.Millisecond);
        Action raiseStockCollectionProperty = new Action(() => RaisePropertyChangedEvent("StockCollection"));
        Dispatcher.BeginInvoke(raiseStockCollectionProperty);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-15 09:54:08

我认为前面的答案不会为你的问题提供解决方案。实际上,您根本没有更新集合:更新的是集合中所有实例的属性。更新集合意味着添加或删除其中的项。由于语义不同,当您触发CollectionChanged事件时,绑定的控件可能不会检查集合中已存在的对象的属性。这将是一个明智的优化。

我建议您在你的股票类中实现INotifyPropertyChange,并在价格属性设置器中触发propertyChanged事件(使用Dispatcher)。

代码语言:javascript
运行
AI代码解释
复制
private DateTime _price;
public DateTime Price
{
   get
   {
     return _price;
   }
   set
   {
     if(_price!=value)
     {
       _price = value;
       RaisePropertyChanged("Price");
     }
   }
}
protected void RaisePropertyChanged(string property)
{
   var propertyChanged = PropertyChanged;
   if(propertyChanged!=null)
   {
     propertyChanged(this,new PropertyChangedEventArgs(property));

   }
}
票数 4
EN

Stack Overflow用户

发布于 2012-01-15 09:21:17

EDIT:我误解了您的问题,它实际上是关于属性更新,而不是集合更新。因此,如果您实际上想要更新集合中的所有项的Price属性,那么下面示例中的Where子句当然不会对您有所帮助。

您实际上并没有修改您的集合;)

代码语言:javascript
运行
AI代码解释
复制
stockCollection.ToList().ForEach((s) => s.Price = DateTime.Now.Millisecond);

您可能需要执行以下操作:

代码语言:javascript
运行
AI代码解释
复制
stockCollection = new ConcurrentBag(stockCollection.Where(...));

编辑

的意思是,我每次都需要创建一个新的集合对象?

因为您的集合既没有实现INotifyCollectionChanged,也没有实现INotifyPropertyChanged,是的。如果可能的话,我建议使用ObservableCollection而不是当前的集合类型。ObservableCollection能够通知项目属性的更新,并在添加/删除项目时引发事件。

代码语言:javascript
运行
AI代码解释
复制
ObservableCollection<YourType> myCollection = new ObservableCollection<YourType>();
...

public ObservableCollection<YourType> MyCollection
{
    get
    {
        return this.myCollection;
    }

    set
    {
        if (value != this.myCollection)
        {
            this.myCollection = value;
            this.RaisePropertyChanged("MyCollection");
        }
    }
}
...
// Following lines of code will update the UI because of INotifyCollectionChanged implementation
this.MyCollection.Remove(...)
this.MyCollection.Add(...)

// Following line of code also updates the UI cause of RaisePropertyChanged
this.MyCollection = new ObservableCollection<YourType>(this.MyCollection.Where(z => z.Price == 45));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8868671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档