0

NSCollectionViewItem 派生自 NSViewController。我将它用作 NSCollectionView 中的原型。它有一个名为 RepresentedObject 的属性。通常,我会使用类似的东西

var set = this.CreateBindingSet<DevViewController, DevViewModel> ();
set.Bind (devTextField).To (vm => vm.Text);
set.Bind (devTextView).To (vm => vm.BigText);       

将 UI 元素与 vm 绑定。对于 NSCollectionViewItem,我想绑定到 RepresentedObject 中的属性。我该怎么做呢?

NSCollectionView.Content 采用 NSObject[]。我目前正在使用我的 List 并制作一个 NSObject[] ,其中每个项目都是 NSObject.FromObject(myClass) - 这本身可能不是正确的方法。

提前致谢!

更新。看来,如果我可以使我的 NSObject 成为 KVO 的对象 ala http://cocoa-mono.org/archives/153/kvc-kvo-and-cocoa-bindings-oh-my-part-1/绑定会自动工作。

4

1 回答 1

1

MvvmCross 及其绑定层的一般做法是:

  • 它尝试使用本机控件,
  • 但它也试图鼓励你保持你的 ViewModel 对象独立并且不知道任何本地选择。

因此,如果您尝试使用需要提供NSObject[]数组的本机控件,并且想要显示(例如)客户列表,那么 MvvmCross 中的合理设计选择是:

  • 在 ViewModel 中:
    • 使用Customer提供的对象INotifyPropertyChanged
    • 在 ViewModel 上提供 aList<Customer>作为参数
  • 在视图中:
    • 提供一个NSObject[]
  • 介于两者之间
    • 寻找:
      • 一种将您映射List<>[]
      • 并找到一种将您映射CustomerNSObject
    • 这可以找到:
      • 使用 View 的继承并提供用于绑定的自定义 C# 属性
      • 或使用自定义绑定
      • 或使用价值转换器

将 映射Customer到 an的挑战NSObject是一个特别有趣的挑战。如果您的最终视图正在寻找 KVO 类型功能,那么我相信可以通过使用小型 Converter 类来完成转换,该类将ValueForKey/映射SetValueForKey到它们的 .Net 反射等效项,并将INotifyPropertyChanged事件映射到它们的DidChangeValueNSObject 等效项。我没有亲自做过这个......但感觉它应该是可行的,并且(有一点PropertyInfo对象缓存)它可能也应该相当有效。


一些最后的笔记:

  • 如果您在 KVO 和 .Net 反射之间编组大量Rio调用,这确实会影响应用程序的性能,那么您可能会发现使用样式字段绑定可能是一种更快的体验,或者您可能会发现编写硬编码的非针对您的特定类型的基于反射的包装器。
  • 如果您的 ViewModel 集合是可变的——例如它支持INotifyCollectionChanged,那么可能还有其他有趣且相当有效的方式可以响应集合更改事件——尽管如果没有一些额外的动画工作,您的视图可能无法特别“漂亮”地支持这些。
于 2013-09-26T11:20:55.163 回答