WPFのMVVMパターンのViewModel部分をWPFアセンブリを参照せずに実装したいと思います。問題のある部分はコマンドルーティングで、コマンドバインドが機能するようにViewModelsにタイプICommand
のプロパティを実装する必要があります。.NETクラスへのプロパティのポストコンパイル
ここではICommand
を避け、単にプロパティーをobject
と宣言します。すべてがまだ機能しているので、それだけです。しかし、私を悩ますものは、をまだ宣言しなければなりません。彼らがボイラープレートコードのように感じるので、私は本当にしたくありません。
私のviewmodelsは現在、次のようになります。
public class HelloWorldViewModel : ViewModel
{
[BoundProperty]
public string Name { get; set; }
[CommandHandler("SayHello")]
public bool CanSayHello()
{
return Name != "" && Name != null;
}
[CommandHandler("SayHello")]
public void SayHello()
{
View.ShowMessage("Hello, {0}!", Name);
}
public object SayHello { get; private set; }
}
BoundPropertyAttribute
が本当にプロパティに自分自身を挿入側面ている間CommandHandlerAttribute
は、(Action
とオプションFunc<bool>
)コマンドハンドラの実行時の発見を可能にしますセッターとINotifyPropertyChanged
を呼び出します。私はコンパイル時ILウィーバーを使用してこれを行います。
理想的には、最後の行(SayHelloプロパティ)も暗黙的にしたいと考えています。それがWPFの要件でなければ、ソースにそこに存在することには意味がありません。
だから、当然、私は、プロパティのポストコンパイルを作成するクラスに必要なILを注入するCommandHandlerAttribute
側面を使用して考え、基本的です。これは非常に難しいですが、優れたILウィーバー(例:PostSharpなど)は、それをより簡単にするために長い道を行くことができます。
私はこの旅に着手する前に、皆さんが私のアプローチについて考えていることを聞きたいと思います。それは健全ですか?より良い方法がありますか?どのように/あなたはそれをやりますか?
「魔法」メソッドとプロパティ名でリフレクションを使用するのは嫌です。私は過去にしばしば見つかったメソッドの名前を変更し、予期せぬUIの問題がコンパイラなしで動作しなくなり、エラーが発生しました。しかし、私はあなたの基本的なデザインが好きです、ワイヤーアップを行うラムダ式はどうですか? –
私はたくさんのラムダの考えが好きです。私はまだインタフェースを単純化するので、リフレクションを介して(少なくともデフォルトでは) "有効にされた"プロパティ/イベントを発見したいかもしれません。 –