我有一个集合,它被绑定到WPF UI中的datagrid。
我的要求是,对于集合中的每一项,我必须每秒更新属性的值10次。
所以我采用了ConcurrentBag类型集合。在更新每个项目的值之后。我明确地解雇了RaisePropertyChange。但是用户界面并没有改变。
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);
}
}
发布于 2012-01-15 09:54:08
我认为前面的答案不会为你的问题提供解决方案。实际上,您根本没有更新集合:更新的是集合中所有实例的属性。更新集合意味着添加或删除其中的项。由于语义不同,当您触发CollectionChanged事件时,绑定的控件可能不会检查集合中已存在的对象的属性。这将是一个明智的优化。
我建议您在你的股票类中实现INotifyPropertyChange,并在价格属性设置器中触发propertyChanged事件(使用Dispatcher)。
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));
}
}
发布于 2012-01-15 09:21:17
EDIT:我误解了您的问题,它实际上是关于属性更新,而不是集合更新。因此,如果您实际上想要更新集合中的所有项的Price
属性,那么下面示例中的Where
子句当然不会对您有所帮助。
您实际上并没有修改您的集合;)
stockCollection.ToList().ForEach((s) => s.Price = DateTime.Now.Millisecond);
您可能需要执行以下操作:
stockCollection = new ConcurrentBag(stockCollection.Where(...));
编辑
的意思是,我每次都需要创建一个新的集合对象?
因为您的集合既没有实现INotifyCollectionChanged
,也没有实现INotifyPropertyChanged
,是的。如果可能的话,我建议使用ObservableCollection
而不是当前的集合类型。ObservableCollection
能够通知项目属性的更新,并在添加/删除项目时引发事件。
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));
https://stackoverflow.com/questions/8868671
复制相似问题