6

私のプロジェクトにはモデルがあり、モデル プロパティの 1 つを使用してラベルの表示状態をバインドしたいと考えています。モデルに別の ShowLabel プロパティを追加したくありません。私はこのようなものを書くことができるようにしたい:

label.Bindings.Add("Visible", model, m => m.Name != "Default");

基本的に、モデルにプロパティを追加する代わりに、ラムダ式を記述できるようにしたいと考えています。これは可能ですか?

4

2 に答える 2

4

はい、Binding クラスのFormatイベントを使用してこれを行うことができます。問題のプロパティに引き続きバインドしますが、Format イベント ハンドラーは別の値 (この場合は bool) を返します。

var binding = new Binding("Visible", model, "Name");
binding.Format += (sender, args) => args.Value = (string)args.Value != "Default";
label.DataBindings.Add(binding);
于 2012-02-23T23:50:03.057 に答える
2

Windows フォームのデータ バインディングはICustomTypeDescriptorインターフェイスを認識します。これにより、オブジェクトは実行時にデータ バインディングに提示するプロパティを決定できます。そのため、その実装を作成すると、Windows フォームに、必要なプロパティがあることを伝えることができ、それらの実装方法を決定できます。

もちろん、それは役に立たないかもしれません。プロパティの追加を避けたい場合は、かなり複雑なインターフェースの実装も避けたいと思うかもしれません。明らかな解決策は、現在バインドしているオブジェクトの代わりに、データ ソースとして機能し、それにバインドすることを仕事とする型を作成することです。

もちろん、そうすれば、代わりにそのラッパーに実装しようとしていたプロパティを実装する方がおそらく簡単です。

一般に、データバインディングでは、UI の利益のためだけにモデルに何かを追加する必要がないという理由だけで、基礎となるモデルに直接バインドすることを避けたいと考えています。これが、「分離されたプレゼンテーション」が非常に人気がある理由です。モデルとビューを直接接続する代わりに、中間に何かを挿入し、仲介する役割を果たします。これをビューモデルと呼ぶ人もいれば、プレゼンターと呼ぶ人もいますが、基本原則は常にプレゼンテーションの分離です。

プレゼンテーションの分離を達成しようとしているように思えますが(これは良いことです)、追加のタイプを導入せずに、この中間層にどこかへ行くようにします。そのレイヤーとして機能するクラス (またはクラスのセット) を定義しないのはなぜですか?

于 2012-02-23T16:01:03.133 に答える