Cocoa绑定仅在窗口焦点更改时更新

时间:2012-12-03 13:03:05

标签: cocoa mono cocoa-bindings monomac

我正在使用MonoMac在C#中为Mac构建桌面下载管理器。

我的XIB有一个表视图,其列绑定到NSArrayController。阵列控制器通过IBOutlet连接到我的主窗口控制器。该数组包含一堆HttpDownload个对象,这些对象派生自NSObject。这些HttpDownload个对象包含TotalSizeTotalDownloadedBandwidth等属性。我使用[Export]属性修饰了这些属性。

在控制器中,我使用NSArrayController方法向AddObject添加了一些HttpDownload对象。以Task.Factory.StartNew()开头的后台进程以异步方式开始下载,并在收到数据时更新绑定属性,如TotalDownloaded和Bandwidth。

我可以看到这些新值反映在表视图中,但只有在我“强制”更新UI时,例如通过使窗口失去焦点,获得焦点或单击其中的按钮窗口。

我尝试在IB中设置Continuously Updates Value,但这没有区别(并且阅读文档,我认为不应该这样做。)

有没有人知道让UI更新“实时”中的绑定值,而不仅仅是在窗口事件发生时?

1 个答案:

答案 0 :(得分:3)

我在发布这个问题后不久就想到了这一点。

我们似乎需要为至少一个正在更新的密钥手动调用WillChangeValue()DidChangeValue(),例如,当我更新下载的总数时:

WillChangeValue("DownloadedBytes");
DownloadedBytes += bytesRead;
DidChangeValue("DownloadedBytes");

在我的情况下,只为一个更新的密钥调用这些方法似乎足以强制更新所有绑定值。

作为参考,在Objective-C中,这些选择器称为[self willChangeValueForKey:@"keyname"][self didChangeValueForKey:@"keyname"]