我正在开发一个WPF应用程序,其中ViewModel定期检查数据源以确定是否需要更改列表的内容。如果ViewModel意识到数据已更改,则会更新列表并更新相应的视图。
但是,我正在努力让更新机制发挥作用。在我的ViewModel中,我声明了一个计时器对象。我将此计时器设置为1秒间隔,将我的一个ViewModel方法订阅到该事件,然后启动计时器。
当计时器触发并尝试更改列表时,我收到“System.NotSupportedException”
This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.
所以我正在寻找解决这个问题的方法。我对C#比较陌生,但想到了可能的解决方案:
让我的viewmodel实现一个'run'方法,在该方法中它只是无限循环,并轮询通过timer elapsed事件设置的成员布尔值。但是,这种方法看起来很糟糕。
查找支持多线程访问的备用列表对象。但是,我没有意识到这样的课程。
由于我是C#的新手,我也可能错过了明显的解决方案。
我很感激任何想法!
最小代码:
public class ConnectionPresenter : ObservableObject
{
/* private */
private readonly ObservableCollection<string> _connectedUsers = new ObservableCollection<string> { "Bob" };
Timer _updateTimer = new Timer(1000);
public ConnectionPresenter()
{
_updateTimer.Elapsed += this.CheckConnections;
_updateTimer.AutoReset = true;
_updateTimer.Start();
}
private void CheckConnections(object sender, ElapsedEventArgs e)
{
_connectedUsers.Add("Bob");
}
}
答案 0 :(得分:0)
这可能适用于您的情况:
private void CheckConnections(object sender, ElapsedEventArgs e)
{
App.Current.Dispatcher.Invoke(() => _connectedUsers.Add("Bob"));
}