2017-08-04 84 views
0

我正在使用ViewModel定期检查数据源以确定它是否需要更改列表内容的WPF应用程序。如果ViewModel意识到数据已更改,它将更新列表和相应的视图更新。如何从C#中的其他线程更新列表?

但是,我努力让更新机制发挥作用。在我的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#,但想到一个观点可能的解决方案:

  • 有我的视图模型实现了“跑”的方法中,它只是同时无限期循环和民调是通过设定一个成员布尔值定时器已用事件。但是,这种方法似乎很难。

  • 查找支持多线程访问的备用列表对象。但是,我不知道这样的课。

这也有可能是我失踪了明显的解决方案,因为我在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

它会像Dispatcher.Run然后lambda表达式,然后你已有的代码。 –

+0

你应该找到更好的搜索引擎使用...谷歌或https://www.bing.com/search?q=from+a+thread+different+from+the+Dispatcher+thread应该没问题。我建议不要在https://www.disney.com/等网站上使用搜索功能进行编程问题。如果没有任何搜索结果有帮助 - 请确保使用您尝试过的内容(即从我选择的重复内容)编辑您的问题,以及它如何解决问题。 –

回答

0

这可能会为你的情况下工作:

private void CheckConnections(object sender, ElapsedEventArgs e) 
{ 
     App.Current.Dispatcher.Invoke(() => _connectedUsers.Add("Bob")); 
}