2009-04-20 11 views
6

更新WPF MVVM:ResourceDictionaryの構成に関する条約?

のStackOverflowのwikiの精神で、ここでの更新です:

私は以下のジョー・ホワイトのIValueConverter提案をスパイクしました。それは魅力のように働く。

これは、安価な文字列置換を使用してViewModels-> Viewsのマッピングを自動化する「クイックスタート」の例です。 ViewModelを表すViewが見つからない場合は、デフォルトで「構築中」ページになります。私はジョーホワイトのアイデアだったので、このアプローチ "WPF MVVM White"をダビングしています。ここにいくつかのスクリーンショットがあります。

最初のイメージは、という純粋な命名規則に基づいて、 "[SomeControlName] ViewModel"に対応する "[SomeControlName]ビュー"があります。 2番目は、ModelViewがそれを表すビューを持っていない場合です。長いViewModelからViewへのマッピングを持つResourceDictionariesはもうありません。これは純粋な命名規則です。私はWPF MVVMのジョシュ・スミスのfantastic MSDN article週末に読ん Mvvm.White.Quickstart.zip


オリジナルポスト

Wpf Mvvm White

は、私はここでプロジェクトのダウンロードを掲載しました。それはカルトの古典になることを予定しています。

レンダリングするためにWPFに尋ねる魔法のまわりで私の頭を包み込むのに、私はしばらくかかった。ViewModel

「ここにはクラス、WPFがあります。どのUIを使用してプレゼンテーションを行うかを理解してください」この魔法を逃した人のために

、WPFはのResourceDictionaryマッピングでのModelViewためビューを検索し、対応するビューを引き出して、これを行うことができます。 (Figure 10 Supplying a Viewまでスクロールします)。すぐに私に飛び出し

最初の事はの強力な命名規則がすでにありますということです。

classNameView ("View" suffix) 
classNameViewModel ("ViewModel" suffix) 

私の質問は次のとおりです。

ResourceDictionaryをプログラム的に操作することができるので、私は「不思議メートル誰でもRegexを管理していれば、を置き換えて、検索は自動的にになり、新しいView/ViewModelは命名規則によって解決されますか?

[編集]私が想像しているのは、ResourceDictionaryへのフック/インターセプトです。

...どのようにちょうど右の生成について

//build list 
foreach .... 
    String.Format("<DataTemplate DataType=\"{x:Type vm:{0} }\"><v:{1} /></DataTemplate>", ...) 
+0

そうそうそれを含むResourceDictionaryのxamlsファイルです

private void RegisterResources() { ResourceDictionary dictionary = new ResourceDictionary(); dictionary.Source = new Uri("pack://application:,,,/StartupModule;Component/UIResources.xaml"); Application.Current.Resources.MergedDictionaries.Add(dictionary); } 

を使用して、直接のResourceDictionaryに私DataTemplatesを読み込むほとんどhthe同じことを行うことを決めました記事は素晴らしいです。私はRelayCommandをすべてのプロジェクトで使用しますが、ボタンテキストやツールチップのようなものを一度だけバインドするためのNameとDescriptionプロパティを追加しました。 – Botz3000

+0

そこにMVVMフレームワークがあります(私は非常に多くのものを見て、これが何が呼び出されたかを忘れています)。私が想起しているように、自動的にビューをビューモデルに結びつけるための名前規約が使用されています。嫌いだった。黒い魔法のように見えました。あなたがコードを見ているとき、どのようにピースが結びついているかは決して分かりません。私は時々文脈で私のビュー・データ・テンプレートを定義して、ビュー/ビュー・モデルがどのように関連しているかを明確にするのが好きです。 –

+1

[プロジェクトのリンク](http://rootsilver.com/files/Mvvm.White.Quickstart.zip)がダウンしています。他の場所に再アップロードできますか? –

答えて

17

ではなく、明示的のResourceDictionaryに物事を追加するためにコードを書いて、:また、コード内のDataTemplate辞書を構築するための*View$*ViewModel$クラス名を引き出すために相互運用機能を使用して、起動時の方法を検討オンデマンドで見る?これはValueConverterで行うことができます。

あなたのリソースは次のようになります。

<Views:ConventionOverConfigurationConverter x:Key="MyConverter"/> 
<DataTemplate DataType="{x:Type ViewModels:ViewModelBase}"> 
    <ContentControl Content="{Binding Converter={StaticResource MyConverter}}"/> 
</DataTemplate> 

は、あなたはまだDataTemplateのリソースが必要ですが、限り、あなたのviewmodels全てが共通の基本クラスを持っているとして、あなただけのすべての世話をするために、1つのDataTemplateをする必要がありますそのうちの。

そして、値コンバータクラスを定義します。

public class ConventionOverConfigurationConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
     CultureInfo culture) 
    { 
     // value is the ViewModel. Based on its GetType(), build a string 
     // with the namespace-qualified name of the view class, then: 
     return Activator.CreateInstance(Type.GetType(viewName)); 
    } 
    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

あなたがする必要があるだろうすべてはあなたのビューとのviewmodelsが同じ名前空間にいるかいないかのようなものに依存しており、変換内部のロジックを記述しています。

+0

を更新しました。それは、私がやりたいことです! =) –

+0

ありがとうジョー - 私はあなたのフィードバックに基づいてこの質問を更新しました。 –

+0

優秀!それは私のApp.xamlを数百行から数十にカットしたものです。 – Grokys

-1

私はそう、私はUIResourcesファイルは、私たちのDataTemplatesのすべて

関連する問題