我正在创建一个小型 Windows 窗体应用程序,它将接收来自后台线程的消息,然后将它们添加到主窗体上的列表中。在表单上,我有一个DataGridView,其DataSource设置为消息列表(例如List<Message>
)
目前,消息堆积如山,但我无法让DataGridView在消息出现时呈现消息。这是我使用的方法的摘要。
1.初始化主窗体设置绑定并启动消息例程
internal Main(IMessageDispatcher messageDispatcher, IMessagePublisher messagePublisher)
{
InitializeComponent();
_messageEntries = new List<Message>();
BindToMessageEntriesList();
_messageDispatcher = messageDispatcher;
_messageDispatcher.OnMessageReceived += MessageDispatcher_OnMessageReceived;
_messageDispatcher.Start();
}
private void BindToMessageEntriesList()
{
MessageEntriesGrid.DataSource = _messageEntries;
}
2.处理收到的消息并添加到内部列表
private void MessageDispatcher_OnMessageReceived(Message message)
{
lock (_logEntries)
{
_messageEntries.Add(message);
}
var cb = new RefreshListCallbackDelegate(RefreshView);
this.Invoke(cb);
}
3.在主线程上刷新
private void RefreshView()
{
MessageEntriesGrid.Refresh();
}
任何人都可以建议我如何让 UI 反映发生的变化。
注意:我也尝试过使用 Invalidate 方法和 ResetBindings 方法。我还尝试将列表切换到ObservableCollection