1

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

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

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

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

我曾尝试在 IB 中设置持续更新值,但这没有任何区别(阅读文档,我认为不应该这样做)。

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

4

1 回答 1

3

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

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

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

就我而言,仅对其中一个更新的键调用这些方法似乎足以强制更新所有绑定值。

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

于 2012-12-03T13:07:56.327 回答