我正在使用MonoMac在C#中为Mac构建桌面下载管理器。
我的XIB有一个表视图,其列绑定到NSArrayController
。阵列控制器通过IBOutlet
连接到我的主窗口控制器。该数组包含一堆HttpDownload
个对象,这些对象派生自NSObject
。这些HttpDownload
个对象包含TotalSize
,TotalDownloaded
,Bandwidth
等属性。我使用[Export]
属性修饰了这些属性。
在控制器中,我使用NSArrayController
方法向AddObject
添加了一些HttpDownload对象。以Task.Factory.StartNew()
开头的后台进程以异步方式开始下载,并在收到数据时更新绑定属性,如TotalDownloaded和Bandwidth。
我可以看到这些新值反映在表视图中,但只有在我“强制”更新UI时,例如通过使窗口失去焦点,获得焦点或单击其中的按钮窗口。
我尝试在IB中设置Continuously Updates Value,但这没有区别(并且阅读文档,我认为不应该这样做。)
有没有人知道让UI更新“实时”中的绑定值,而不仅仅是在窗口事件发生时?
答案 0 :(得分:3)
我在发布这个问题后不久就想到了这一点。
我们似乎需要为至少一个正在更新的密钥手动调用WillChangeValue()
和DidChangeValue()
,例如,当我更新下载的总数时:
WillChangeValue("DownloadedBytes");
DownloadedBytes += bytesRead;
DidChangeValue("DownloadedBytes");
在我的情况下,只为一个更新的密钥调用这些方法似乎足以强制更新所有绑定值。
作为参考,在Objective-C中,这些选择器称为[self willChangeValueForKey:@"keyname"]
和[self didChangeValueForKey:@"keyname"]
。