2011-04-25 3 views
2

できるだけ柔軟に、すばやく簡単に「再スキン化」できるアプリケーションを作成したいと考えています。通常、これはリソース辞書のテンプレートとスタイルを交換することで実現します。MVVMで「ルックレス」ビューを作成する

WPFのカスタムコントロールは、「ルックレス」に設計されています。すべてのロジックがコードになり、辞書のコントロールテンプレートを使用して外観がコントロールに関連付けられます。

MVVMとカスタムコントロールの間には多くのオーバーラップがあります。多くの開発者は、MVVMはカスタムコントロールよりも優れていると言います。どちらも、ビューから別のコードファイルにロジックを移動する方法と見ることができます。カスタムコントロールにビュー固有のロジックが含まれているときに、VMにドメイン関連のロジックが含まれている場合、2つの意味に違いがあると思います。

関連するビューXAMLをスワップアウトできるリソースディクショナリに移動する最適な方法は何ですか。私は辞書でストレートデータテンプレートを使うべきですか(私の好みの方法ではなく、ビューは複雑です)?ビューを置き換えるためのカスタムコントロールを作成し、それに対するコントロールテンプレートを定義する必要があります(コントロールとVMの間でコードが重複します)。これらのファイルをリソース辞書でスワップアウトできるように、ビューに対してUserControlsを使用し、これらのコントロールのXAMLを分離する必要がありますか?

この問題をどのように処理しますか?助言がありますか?

ありがとうございます!

+2

MVVMとカスタムコントロールは、問題に対する競合するアプローチではありません。 –

+0

両方を同時に使用してみると、2つの間に重なりがあることがわかります。シナリオによって異なります。 –

+0

私は、類似のスキン制御テンプルと一致する命名規則で、リソースディクショナリ全体を使用します。実行時に辞書をre-skinに再リンクするだけで済みます。 – CodeWarrior

答えて

2

個人的に私は、これは、基本的にあなたを必要と using an IValueConverter like this post.

を使って好き:

  • WPFは、カスタム・ロジックとIValueConverterを実装した値コンバータ
  • を使う必要とするように、アプリケーションのリソースに一つのエントリを置きますあなたは欲しい。

これにより、アプリケーションに必要と思われるほどの柔軟性が得られます。上記の記事は、戦略を見上げる設定より規約を使用しますが、あなたは簡単にあなたがそうのような/解決オブジェクトを登録することができ、サービスに依存しているコンバータのためにそれを入れ替えることができます。

public static class ServiceProvider 
{ 
    public void Register<TView>(Type ViewModelType); 
    public void Register(IDictionary<Type,Type> ViewLookup); 
    public object Resolve(object ViewModel); 
} 

HTH

+0

私はこの考えが好きです。見た目のないビューを作成するためにこれを適用するには少し想像力が必要ですが、潜在的可能性があると私は考えています。これにより、私たちはもっと簡単に見解を交換することができます。 –

関連する問題