2013-09-26 4 views
0

NSCollectionViewItem получен из NSViewController. Я использую его как прототип в NSCollectionView. Он обладает свойством, называемым RepresentedObject. Обычно я бы использовал что-то вродеКак связать существующий элемент в NSCollectionViewItem?

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

связать элементы пользовательского интерфейса с vm. В случае NSCollectionViewItem, я хочу привязываться к свойствам в представлении объекта. Как мне это сделать?

NSCollectionView.Content принимает NSObject []. В настоящее время я беру свой список и создаю NSObject [], где каждый элемент содержит NSObject.FromObject (myClass), который сам по себе не может быть правильным.

Заранее благодарен!

Обновление. Кажется, что если я могу сделать свой NSObject объектом KVO'd ala http://cocoa-mono.org/archives/153/kvc-kvo-and-cocoa-bindings-oh-my-part-1/, что привязки будут автоматически работать.

ответ

1

Общий подход MvvmCross и его связывание слоя является то, что:

  • он пытается работать с носителями управления,
  • , но он также пытается стимулировать вас, чтобы сохранить ваш ViewModel объектов независим и о каком-либо собственный выбор.

Так что, если вы пытаетесь использовать нативный контроль, который требует от вас поставить NSObject[] массив, и вы хотите отобразить (например) список клиентов, то разумный выбор дизайна в MvvmCross будет:

  • в ViewModel:
    • использовать Customer объект, который обеспечивает INotifyPropertyChanged
    • поставлять List<Customer> в качестве параметра на вашем ViewModel
  • в Вид:
    • на поставку NSObject[]
  • где-то между этими двумя
    • находке:
      • способ отображения вашей List<> Ань []
      • и найдите способ сопоставления Customer к NSObject
    • это можно найти либо:
      • используя наследование View и обеспечивая # настраиваемое свойство C для связывания
      • или с помощью пользовательской привязки
      • или с использованием значения преобразователя

особенно интересна задача картирования Customer на NSObject. Если ваш конечный вид ищет функциональность типа KVO, я полагаю, что преобразование может быть выполнено с использованием небольшого класса конвертера, который отображает ValueForKey/SetValueForKey на их эквивалент отражения .Net и который отображает события INotifyPropertyChanged на их DidChangeValue эквивалент NSObject. Я лично не сделал этого ... но кажется, что это должно быть выполнимо, и (с небольшим кэшированием объектов PropertyInfo), вероятно, он тоже должен быть достаточно эффективным.


Некоторых заключительные замечания:

  • если вы сортировочные на много вызовов между КВО и .Net отражением, и это оказывает влияние на производительность приложения, то вы можете найти с помощью Rio стиля поля связывания может быть более быстрый опыт, или вы можете обнаружить, что быстрее писать жестко закодированные обертки, не связанные с отражением, для ваших конкретных типов.
  • если ваша коллекция ViewModel изменена - например. он поддерживает INotifyCollectionChanged, тогда могут быть и другие интересные и разумно эффективные способы реагирования на события изменения коллекции - хотя ваш взгляд может не поддерживать их особенно «красиво» без дополнительной анимационной работы.