I am having a class
named Employee
. I need to update only the property Status
from thread other than current dispatcher thread:
class Employee
{
public string Name { get; set; }
public string Status { get; set; }
}
Viewmodel (ViewModelBase
implements INotifyPropertyChanged
interface):
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class DisplayViewModel : ViewModelBase
{
public static event EventHandler OnStatusChanged;
ObservableCollection<Employee> _dailyEmployees;
public ObservableCollection<Employee> DailyEmployees
{
get { return _dailyEmployees; }
set
{
_dailyEmployees = value;
OnPropertyChanged();
}
}
public DisplayViewModel()
{
OnStatusChanged += DisplayViewModel_OnStatusChanged;
}
//invoked in other thread
private void DisplayViewModel_OnStatusChanged(object sender, EventArgs e)
{
var d = sender as Employee;
if (d == null)
return;
var em = DailyEmployees.FirstOrDefault(a => a.Name == d.Name);
if(em == null)
{
DailyEmployees.Add(em);
}
else
{
em.Status = d.Status;
}
}
}
When i tried adding values to observable collection it throws exception as
"This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread"
How shall I proceed? Thanks.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…