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[] を取ります。私は現在、リストを取得して、そこにある各アイテムが NSObject.FromObject(myClass) である NSObject[] を作成しています。これ自体は正しいアプローチではない可能性があります。

前もって感謝します!

アップデート。私の NSObject を KVO'd オブジェクト 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
    • ViewModelList<Customer>のパラメーターとして a を指定する
  • ビュー内:
    • 供給するためにNSObject[]
  • 2つの間のどこか
    • 探す:
      • List<>あなたをにマッピングする方法[]
      • をマッピングする方法を見つけCustomerますNSObject
    • これは、次のいずれかで見つけることができます。
      • ビューの継承を使用し、バインド用のカスタム C# プロパティを提供する
      • またはカスタムバインディングを使用する
      • または値コンバーターを使用する

Customerを anにマッピングするという課題NSObjectは、特に興味深いものです。ValueForKeyエンド ビューが KVO タイプの機能を探している場合、 /SetValueForKeyを .Net リフレクションに対応するものにマップINotifyPropertyChangedし、イベントをDidChangeValueNSObjectに対応するものにマップする小さな Converter クラスを使用して変換できると思います。私は個人的にこれを行ったことはありません...しかし、それは実行可能であるように感じられ、(PropertyInfoオブジェクトのキャッシュが少しあれば)おそらくかなり効率的であるはずです。


いくつかの最終的なメモ:

  • KVO と .Net リフレクションの間で多くの呼び出しをマーシャリングしていて、これがアプリケーションのパフォーマンスに影響を与える場合は、Rioスタイル フィールド バインディングを使用する方が高速なエクスペリエンスになるか、ハードコーディングされた非特定のタイプのリフレクション ベースのラッパー。
  • ViewModel コレクションが変更可能である場合 (サポートしているINotifyCollectionChanged場合など)、コレクション変更イベントに応答できる興味深い合理的な方法が他にもあるかもしれませんが、追加のアニメーション作業がなければ、ビューはこれらを特に「美しく」サポートしていない可能性があります。
于 2013-09-26T11:20:55.163 に答える