如何绑定到NSCollectionViewItem中的现有项?

时间:2013-09-26 07:17:36

标签: mvvmcross monomac

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/,绑定会自动生效。

1 个答案:

答案 0 :(得分:1)

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

  • 它尝试使用本机控件,
  • 但它也会尝试鼓励您保持ViewModel对象的独立性,并且不会发现任何原生选择。

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

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

Customer映射到NSObject的挑战是一个特别有趣的挑战。如果您的终端视图正在寻找KVO类型功能,那么我相信转换可以通过使用一个小型Converter类来完成,该类将ValueForKey / SetValueForKey映射到它们的.Net反射等价物,并映射{{1事件到他们的INotifyPropertyChanged NSObject等价物。我个人并没有这样做......但感觉它应该是可行的,而且(对DidChangeValue个对象进行一点缓存)它也应该是合理有效的。


最后的一些说明:

  • 如果你在KVO和.Net反射之间编组很多的调用,这确实会影响你的应用程序的性能,那么你可能会发现使用PropertyInfo样式字段绑定可能是一种更快的体验,或者您可能会发现为特定类型编写基于硬编码非反射的包装器会更快。
  • 如果您的ViewModel集合是可变的 - 例如它支持Rio,然后可能还有其他有趣且合理有效的方式来响应收集更改事件 - 尽管如果没有一些额外的动画工作,您的视图可能不会支持这些特别“漂亮”。